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

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

Imperfect C++ 讀書筆記(二)

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

可移植的虛函數(shù)表

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

 

接口代碼:

// 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關(guān)鍵字

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

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

 

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

#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)
{
    ...    // 臨界區(qū)代碼
}
 
    ...    // 非臨界區(qū)代碼
 
synchronized(Object, obj)
{
    ...    // 臨界區(qū)代碼
}

 

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

這里還有個問題要注意,如果同一個作用域中出現(xiàn)了兩個同步段,某些老式編譯器(如大名鼎鼎的VC6.0)對for循環(huán)處理的不那么“標準”,就會報出“重新定義__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)對循環(huán)變量的釋放,會延遲到整個作用域結(jié)束時,而不是臨界代碼段的右括號處。所以該解決方案是錯誤的!

 

局部靜態(tài)對象

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

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函數(shù)seched_yield()將執(zhí)行機會讓給其他線程
    }
    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>
            99国内精品久久久久久久软件| 欧美成人国产一区二区| 亚洲二区精品| 在线观看成人一级片| 久久视频精品在线| 亚洲黄网站在线观看| 亚洲性视频网址| 国产精品永久免费观看| 午夜一级久久| 欧美激情精品久久久久久久变态 | 狂野欧美激情性xxxx欧美| 欧美激情视频免费观看| 一区二区三区日韩精品视频| 国产亚洲电影| 欧美精品久久久久久久免费观看| 夜色激情一区二区| 欧美国产视频在线观看| 午夜在线精品偷拍| 91久久国产自产拍夜夜嗨| 国产欧美一区二区精品仙草咪| 欧美顶级艳妇交换群宴| 欧美在线播放视频| 一区二区三区高清在线| 亚洲国产精品久久久| 久久久久欧美| 久久se精品一区二区| av不卡在线观看| 亚洲国产精品欧美一二99| 国产日韩欧美二区| 国产精品青草综合久久久久99| 欧美大片免费观看| 欧美一区国产一区| 亚洲欧美经典视频| 中日韩高清电影网| 一本大道久久a久久综合婷婷| 欧美福利视频一区| 久久亚洲精品一区| 久久久久国产精品一区| 亚洲综合视频1区| 亚洲最新合集| 亚洲美女视频在线观看| 亚洲片国产一区一级在线观看| 国产揄拍国内精品对白| 国产日韩欧美自拍| 国模一区二区三区| 激情综合网址| 激情成人中文字幕| 激情视频一区二区| 在线观看亚洲一区| 亚洲电影网站| 久久九九热re6这里有精品| 亚洲激情亚洲| 亚洲第一搞黄网站| 亚洲高清毛片| 亚洲国产一区在线观看| 永久久久久久| 亚洲福利视频一区二区| …久久精品99久久香蕉国产| 在线不卡中文字幕播放| 亚洲国产精品嫩草影院| 亚洲精品一区二区网址| 99精品福利视频| 亚洲网址在线| 午夜在线观看欧美| 久久在线免费视频| 亚洲精美视频| 亚洲视频在线一区观看| 午夜精品成人在线| 欧美在线观看网址综合| 蜜臀a∨国产成人精品| 欧美精品一区二区精品网| 欧美视频免费在线| 国产一区二区无遮挡| 91久久亚洲| 香蕉久久夜色精品国产| 免费人成网站在线观看欧美高清| 亚洲精品国产精品国产自| 亚洲午夜激情网页| 久久成人这里只有精品| 欧美男人的天堂| 国产一区二区三区久久久久久久久| 亚洲国产美女| 欧美一级片一区| 亚洲人永久免费| 欧美一区二区视频在线观看2020| 免费视频一区| 国产一区二区三区久久悠悠色av | 亚洲精品乱码久久久久久黑人| 亚洲午夜精品久久久久久app| 久久久福利视频| 日韩视频在线观看免费| 久久久久久久网站| 欧美日韩亚洲一区二区三区四区| 国产亚洲精品一区二区| 亚洲最新色图| 欧美激情片在线观看| 亚洲欧美中文日韩v在线观看| 欧美成人国产| 激情视频一区二区| 久久aⅴ乱码一区二区三区| 欧美成va人片在线观看| 亚洲精品免费一二三区| 亚洲人成网站影音先锋播放| 亚洲欧美资源在线| 亚洲精品极品| 久久免费少妇高潮久久精品99| 欧美系列精品| 一区二区欧美日韩| 欧美成人中文字幕| 久久精品国产一区二区三区免费看 | 国产精品一区一区| 一区二区三区不卡视频在线观看| 久久久久久久久久码影片| 亚洲欧美美女| 国产精品国产一区二区| 亚洲色在线视频| 亚洲精品三级| 欧美日韩国产精品自在自线| 亚洲精品国产欧美| 欧美黑人在线播放| 麻豆精品一区二区综合av| 狠狠色综合色区| 狂野欧美性猛交xxxx巴西| 久久久国产午夜精品| 伊人久久av导航| 欧美大胆a视频| 狂野欧美一区| 日韩一级在线观看| 99精品欧美一区| 国产精品手机视频| 久久国产精品色婷婷| 久久狠狠婷婷| 在线成人av| 亚洲精品美女91| 国产精品久久久久影院色老大 | av成人激情| 这里只有精品丝袜| 国产视频久久网| 久久综合九九| 欧美精品久久99| 午夜精品99久久免费| 久久成人精品一区二区三区| 在线观看欧美精品| 日韩午夜免费| 国产一区二区av| 欧美高清视频在线| 国产精品福利影院| 久久在线免费观看| 欧美日韩成人一区| 久久网站免费| 欧美激情第三页| 欧美伊人精品成人久久综合97| 欧美在线网址| 国产一区二区精品久久| 欧美了一区在线观看| 亚洲女同在线| 久久激情五月丁香伊人| 亚洲狼人综合| 欧美与黑人午夜性猛交久久久| 亚洲经典三级| 亚洲免费中文字幕| 亚洲精品久久久久久一区二区 | 亚洲精品麻豆| 午夜国产精品视频免费体验区| 亚洲国产欧美久久| 亚洲综合精品四区| 日韩亚洲欧美成人一区| 欧美一区午夜精品| 亚洲视频国产视频| 欧美成ee人免费视频| 久久都是精品| 欧美日韩精品免费看| 可以看av的网站久久看| 国产精品私房写真福利视频| 亚洲国产美国国产综合一区二区| 国产日韩1区| 99国产精品自拍| 亚洲区一区二区三区| 久久精品综合网| 欧美一区二区性| 欧美先锋影音| 亚洲精品女人| 激情五月综合色婷婷一区二区| 亚洲一区二区三区视频播放| 夜夜嗨av一区二区三区网页| 久久综合99re88久久爱| 久久久久久久欧美精品| 国产女主播在线一区二区| 一本一本久久a久久精品综合麻豆| 亚洲国产日韩一区二区| 久久久久青草大香线综合精品| 欧美一区二区三区四区高清| 国产精品豆花视频| 亚洲少妇最新在线视频| 亚洲特级片在线| 欧美亚州一区二区三区| 99精品欧美一区二区蜜桃免费| 99精品欧美一区| 欧美日韩一区二区三区| 亚洲精品人人|