我有這兩種方法的線程獨佔訪問CMyBuffer
對象:如何使用CSingleLock提供對此緩衝區的訪問?
頁眉:
class CSomeClass
{
//...
public:
CMyBuffer & LockBuffer();
void ReleaseBuffer();
private:
CMyBuffer m_buffer;
CCriticalSection m_bufferLock;
//...
}
實現:
CMyBuffer & CSomeClass::LockBuffer()
{
m_bufferLock.Lock();
return m_buffer;
}
void CSomeClass::ReleaseBuffer()
{
m_bufferLock.Unlock();
}
用法:
void someFunction(CSomeClass & sc)
{
CMyBuffer & buffer = sc.LockBuffer();
// access buffer
sc.ReleaseBuffer();
}
- 我喜歡的是, 用戶只需撥打一個功能 呼叫,鎖定後只能訪問緩衝區 。
- 我不要 像是用戶必須明確釋放 。
更新:被指出這些額外的缺點了由尼克·邁耶和馬丁紐約:
- 用戶能夠解除鎖定,然後使用緩衝區。
- 如果在釋放鎖之前發生異常,緩衝區將保持鎖定狀態。
我想用CSingleLock
對象(或類似的東西)來實現,當對象超出範圍時它會解鎖緩衝區。
這可怎麼辦?
你覺得重載** operator - >()**?這樣,人們可以說* b-> doStuff()*,而不必製作* static_cast *。 – foraidt 2009-08-12 11:14:41
附錄:我認爲* static_cast *變得如此醜陋,以便使其變得引人注目並且不那麼瑣碎。但是在這種情況下,實際上應該這樣做,所以不需要爲用戶做出比必要更難的施加力。 – foraidt 2009-08-12 11:25:03
我目前正在嘗試它,並注意到,**運算符*()**也應該超載。 – foraidt 2009-08-12 11:30:13