青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 13, comments - 4, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Imperfect C++ 讀書筆記(二)

Posted on 2008-11-19 00:14 Batiliu 閱讀(523) 評論(0)  編輯 收藏 引用 所屬分類: 讀書筆記

可移植的虛函數表

C++并非一門合適的模塊——接口語言,為了支持ABI/OAB(Application Binary Interface/Objects Across Borders)需要付出相當程度的努力,并且使用者還必須受到嚴格的約束。下面介紹一種得到廣泛運用的跨邊界對象技術,如果你熟悉Win32 COM,肯定立馬心領神會。

 

接口代碼:

// Interface.h
//
struct IObject;
 
struct IObjectVTable
{
    void (*SetName)(struct IObject * obj, char const * s);
    char const * (*GetName)(struct IObject const * obj);
};
 
struct IObject
{
    struct IObjectVTable * const vtable;
#ifdef __cplusplus
protected:
    IObject(struct IObjectVTable * vt)
        : vtable(vt)
    {}
    ~IObject()
    {}
public:
    inline void SetName(char const * s)
    {
        assert(NULL != vtable);
        vtable->SetName(this, s);
    }
    inline char const * GetName() const
    {
        assert(NULL != vtable);
        return vtable->GetName(this);
    }
private:
    IObject(IObject const & rhs);
    IObject & operator=(IObject const & rhs);
#endif    /* __cplusplus */
};
 
extern "C" IObject * createObject();
extern "C" void destroyObject(IObject *);

 

服務端代碼:

// Server.cpp
//
class Object : public IObject
{
public:
    virtual void SetName(char const * s)
    {
        m_name = s;
    }
    virtual char const * GetName() const
    {
        return m_name.c_str();
    }
#ifndef POAB_COMPILER_HAS_COMPATIBLE_VTABLES
public:
    Object()
        : IObject(GetVTable())
    {}
    Object(Object const & rhs)
        : IObject(GetVTable())
        , m_name(rhs.m_name)
    {}
private:
    static void SetName_(IObject * this_, char const * s)
    {
        static_cast<Object*>(this_)->SetName(s);
    }
    static char const * GetName_(IObject const * this_)
    {
        return static_cast<Object const *>(this_)->GetName();
    }
    static IObjectVTable * GetVTable()
    {
        static IObjectVTable s_vt = MakeVTable();
        return &s_vt;
    }
    static IObjectVTable MakeVTable()
    {
        IObjectVTable vt = { SetName_, GetName_ };
        return vt;
    }
#endif    /* !POAB_COMPILER_HAS_COMPATIBLE_VTABLES */
private:
    std::string m_name;
};

 

客戶端代碼:

// Client.cpp
//
int _tmain(int argc, _TCHAR* argv[])
{
    IObject * pObj = createObject();
 
    pObj->SetName("Matthew Wilson");
 
    std::cout << "name: " << pObj->GetName() << std::endl;
 
    destroyObject(pObj);
 
    return 0;
}

 

synchronized關鍵字

Java中有synchronized關鍵字,.NET中有lock關鍵字,它們可以被用于守護臨界區。而C++標準對線程幾乎只字未提,自然也沒有相關設施。而然借助一點點宏,我們就能輕松實現同樣的效果:(lock_scope請參考筆記(一)中的域守衛類)

#define SYNCHRONIZED_BEGIN(T, v) \
    { \
        lock_scope<T> __lock__(v);
#define SYNCHROIZED_END() \
    }

 

如果你和我一樣不喜歡SYNCHROIZE_END()部分,畢竟和synchronized或lock比起來似乎不那么優雅,那么可以用點小技巧,像這樣定義宏:

#define synchronized(T, v) \
    for (synchronized_lock<lock_scope<T> > __lock__(v); \
        __lock__; __lock__.end_loop())
 
template<typename T>
struct synchronized_lock : public T
{
public:
    template<typename U>
    synchronized_lock(U & u)
        : T(u)
        , m_bEnded(false)
    {}
    operator bool () const
    {
        return !m_bEnded;
    }
    void end_loop()
    {
        m_bEnded = true;
    }
private:
    bool m_bEnded;
};

客戶代碼:

synchronized(Object, obj)
{
    ...    // 臨界區代碼
}
 
    ...    // 非臨界區代碼
 
synchronized(Object, obj)
{
    ...    // 臨界區代碼
}

 

上述代碼,熟悉JAVA的朋友是不是很親切?不過還是有個小小的遺憾,那就是對象的類型不能被自動推導出來,導致我們必須手工提供兩個參數。

這里還有個問題要注意,如果同一個作用域中出現了兩個同步段,某些老式編譯器(如大名鼎鼎的VC6.0)對for循環處理的不那么“標準”,就會報出“重新定義__lock__”的錯誤。所以作者對此提供了一個可移植的解決方案,來確保每個“__lock__”都是不一樣的:

#define concat__(x, y) x ## y
#define concat_(x, y) concat__(x, y)    // 用兩層宏來取__LINE__的實際值
#define synchronized(T, v) \
    for (synchronized_lock<lock_scope<T> > concat_(__lock__,__LINE__)(v); \
        concat_(__lock__,__LINE__); concat_(__lock__,__LINE__).end_loop())

但是,作者似乎忘了,某些老式編譯器(如VC6.0)對循環變量的釋放,會延遲到整個作用域結束時,而不是臨界代碼段的右括號處。所以該解決方案是錯誤的!

 

局部靜態對象

函數局部靜態對象的初始化存在的固有的競爭條件是非常重要的問題。因此不能被忽略。然而,它同時也是非常罕見的情況。我們可以利用其罕見性,給出一個極其優雅的解決方案,該解決方案基于自旋互斥體。自旋互斥體本身依賴于原子操作,它的開銷是非常低的。

class spin_mutex
{
public:
    explicit spin_mutex(int * p = NULL)
        : m_spinCount((NULL != p) ? p : &m_internalCount)
        , m_internalCount(0)
    {}
    void lock()
    {
        for (; 0 != atomic_write(m_spinCount, 1); sched_yield())
        {}    // PTHREAD函數seched_yield()將執行機會讓給其他線程
    }
    void unlock()
    {
        atomic_set(m_spinCount, 0);
    }
private:
    int * m_spinCount;
    int m_internalCount;
private:
    spin_mutex(spin_mutex const & rhs);
    spin_mutex & operator=(spin_mutex const & rhs);
};
 
Local & GetLocal()
{
    static int guard;         // 在加載期被初始化為0
    spin_mutex smx(&guard);             // 對guard進行自旋
    lock_scope<spin_mutex> lock(smx);   // 使用smx來加鎖
 
    static Local local;
    return local;
}
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            香蕉久久夜色精品国产| 欧美色一级片| 亚洲欧洲精品一区二区三区不卡 | 亚洲第一网站| 尤物精品在线| 亚洲大片av| 亚洲精品久久久久| 夜夜夜精品看看| 亚洲欧美精品suv| 欧美一区二区大片| 免费观看成人| 亚洲精品欧美精品| 亚洲一区二区在线播放| 久久精品国产96久久久香蕉| 另类天堂av| 欧美视频一区二区三区在线观看| 国产精品爱久久久久久久| 国产一区二区精品丝袜| 亚洲国产视频一区二区| 亚洲午夜激情网站| 久久一区二区三区av| 亚洲欧洲精品一区二区精品久久久| 亚洲精品网站在线播放gif| 亚洲欧美日韩国产成人精品影院| 久久精品视频亚洲| 欧美日韩综合不卡| 一区二区视频免费在线观看| 亚洲另类黄色| 久久久久久色| 亚洲免费观看高清完整版在线观看熊| 亚洲欧美综合网| 欧美精品电影| 精品成人久久| 欧美一区二区三区喷汁尤物| 亚洲福利视频在线| 欧美伊人久久大香线蕉综合69| 欧美成人一区二区三区在线观看 | 欧美国产先锋| 亚洲综合视频在线| 欧美精品少妇一区二区三区| 国产又爽又黄的激情精品视频| 一区二区久久久久久| 欧美国产第二页| 亚洲成人在线视频播放 | 亚洲免费视频观看| 免费日韩视频| 黄色资源网久久资源365| 午夜精品婷婷| 夜夜爽夜夜爽精品视频| 欧美国产精品一区| 亚洲福利国产精品| 久久蜜桃av一区精品变态类天堂| 一区二区免费在线观看| 欧美剧在线观看| 亚洲精品久久视频| 欧美黄在线观看| 久久久久久夜| 在线不卡中文字幕| 猛干欧美女孩| 久久久久久精| 樱桃视频在线观看一区| 久久综合中文色婷婷| 久久精品视频在线看| 国内自拍一区| 久久五月天婷婷| 久久精品国产综合精品| 极品av少妇一区二区| 久久婷婷人人澡人人喊人人爽| 久久久噜久噜久久综合| 亚洲国产精品一区二区第四页av| 欧美顶级少妇做爰| 欧美大片一区| 亚洲午夜av| 先锋影音久久久| 激情久久久久| 亚洲国产天堂久久综合| 欧美日韩专区| 久久天堂成人| 欧美黑人多人双交| 亚洲一区999| 午夜精品成人在线| 在线成人中文字幕| 亚洲精品免费在线播放| 国产精品视频一区二区三区| 欧美在现视频| 久热爱精品视频线路一| 一本久道综合久久精品| 亚洲淫性视频| 亚洲大片精品永久免费| 欧美激情一二区| 欧美日韩午夜精品| 久久精品视频播放| 欧美激情视频一区二区三区免费| 亚洲性感激情| 久久婷婷成人综合色| 亚洲色图自拍| 久久精品日韩一区二区三区| 日韩一级大片| 亚洲制服少妇| 久久精品盗摄| 欧美大片专区| 欧美在线视频一区二区| 欧美成人在线免费观看| 欧美一区二区视频免费观看| 免费成人毛片| 久久精品久久99精品久久| 欧美www视频| 久久精品99国产精品日本| 欧美日本韩国一区| 麻豆九一精品爱看视频在线观看免费 | 亚洲精品国产欧美| 一区二区三区四区国产| 亚洲国产精品123| 亚洲欧美激情四射在线日| 亚洲老板91色精品久久| 久久国产日韩| 欧美与黑人午夜性猛交久久久| 欧美精品一区二区精品网| 麻豆国产精品777777在线 | 欧美黄色视屏| 美女脱光内衣内裤视频久久影院| 欧美日韩综合视频网址| 欧美激情精品久久久久| 激情成人综合| 久久精品免费看| 欧美在线3区| 国产精品久久久久久久午夜片| 亚洲国产日韩欧美一区二区三区| 国产一区二区三区自拍| 亚洲一区二区三区四区五区黄 | 国产日韩三区| 亚洲一级片在线看| 亚洲一区日韩| 国产精品va在线播放我和闺蜜| 91久久线看在观草草青青| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美日韩第一区| 欧美好骚综合网| 91久久极品少妇xxxxⅹ软件| 久久免费高清视频| 免费一区视频| 亚洲人成网在线播放| 老司机一区二区| 亚洲国产婷婷香蕉久久久久久99 | 亚洲欧美国内爽妇网| 欧美日韩精品在线观看| 亚洲精品小视频| 久久久久久综合网天天| 日韩亚洲综合在线| 欧美日韩免费一区二区三区| 亚洲经典三级| 亚洲视频在线一区观看| 欧美日本视频在线| 日韩视频在线一区二区| 亚洲欧美在线免费观看| 国产一区二区看久久| 久久久久久婷| 亚洲日韩欧美视频一区| 亚洲一二区在线| 国产亚洲女人久久久久毛片| 久久久精品动漫| 亚洲激情在线视频| 亚洲伊人一本大道中文字幕| 国产日韩在线不卡| 模特精品裸拍一区| 亚洲天堂网在线观看| 久久香蕉国产线看观看av| 亚洲黄色有码视频| 国产精品美女xx| 久久久国产一区二区| 亚洲精品一区久久久久久| 亚洲欧美日韩一区二区三区在线观看 | 亚洲剧情一区二区| 欧美在线黄色| 亚洲欧洲精品一区二区三区| 欧美午夜无遮挡| 久久男人av资源网站| 99re这里只有精品6| 久久精品夜色噜噜亚洲a∨| 亚洲人午夜精品免费| 国产精品影视天天线| 欧美国产精品| 欧美伊人久久久久久午夜久久久久| 欧美jizzhd精品欧美巨大免费| 一区二区三区精品视频在线观看| 国产美女精品视频免费观看| 欧美成人xxx| 欧美影院在线播放| 在线性视频日韩欧美| 欧美成人亚洲| 久久久噜噜噜久久中文字幕色伊伊| 亚洲精选一区二区| 国自产拍偷拍福利精品免费一| 欧美三级日本三级少妇99| 久久亚洲影院| 久久国产精品毛片| 欧美亚洲日本网站| 亚洲午夜精品一区二区| 亚洲精品一区二区三区不| 亚洲春色另类小说|