1.CComSingleThreadModel和CComMultiThreadModel特征類:
class?CComSingleThreadModel
{
public:
????static?ULONG?WINAPI?Increment(LPLONG?p)?throw()?{return?++(*p);}
????static?ULONG?WINAPI?Decrement(LPLONG?p)?throw()?{return?--(*p);}
????typedef?CComFakeCriticalSection?AutoCriticalSection;
????typedef?CComFakeCriticalSection?CriticalSection;
????typedef?CComSingleThreadModel?ThreadModelNoCS;
};
class?CComMultiThreadModel
{
public:
????static?ULONG?WINAPI?Increment(LPLONG?p)?throw()?{return?InterlockedIncrement(p);}
????static?ULONG?WINAPI?Decrement(LPLONG?p)?throw()?{return?InterlockedDecrement(p);}
????typedef?CComAutoCriticalSection?AutoCriticalSection;
????typedef?CComCriticalSection?CriticalSection;
????typedef?CComMultiThreadModelNoCS?ThreadModelNoCS;
};
其中的CFakeCriticalSection定義如下:
class?CComFakeCriticalSection
{
public:
????HRESULT?Lock()?throw()?{?return?S_OK;?}
????HRESULT?Unlock()?throw()?{?return?S_OK;?}
????HRESULT?Init()?throw()?{?return?S_OK;?}
????HRESULT?Term()?throw()?{?return?S_OK;?}
};
這兩個類提供了針對特定套間對象的同步控制支持。
CComSingleThreadModel適用于單線程套間對象,它不采用任何線程同步機制;CComMultiThreadModel適用于多線程套間對象,它使用win32的同步機制來實現。
2.CComObjectRootEx模板類
template?<class?ThreadModel>
class?CComObjectRootEx?:?public?CComObjectRootBase
{
public:
????typedef?ThreadModel?_ThreadModel;
????typedef?typename?_ThreadModel::AutoCriticalSection?_CritSec;
????typedef?CComObjectLockT<_ThreadModel>?ObjectLock;
????ULONG?InternalAddRef()
????{
????????return?_ThreadModel::Increment(&m_dwRef);
????}
????ULONG?InternalRelease()
????{
????????return?_ThreadModel::Decrement(&m_dwRef);
????}
????void?Lock()?{m_critsec.Lock();}
????void?Unlock()?{m_critsec.Unlock();}
private:
????_CritSec?m_critsec;
};
它使用傳入的線程模型特征類來實現對象獨立存在時所需要的引用計數支持,同時提供了一個方便對象開發使用的同步鎖,我們可以使用這個鎖來完成對自定義數據訪問的保護。
posted on 2007-04-06 14:39
michael 閱讀(1614)
評論(0) 編輯 收藏 引用 所屬分類:
心得