CMyBuffer
オブジェクトへのスレッド排他アクセスには、次の 2 つの方法があります。
ヘッダ:
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();
}
- これについて私が気に入っているのは、ユーザーが関数呼び出しを 1 回だけ行う必要があり、バッファーをロックした後にのみバッファーにアクセスできることです。
- 私が気に入らないのは、ユーザーが明示的に解放しなければならないことです。
更新: これらの追加の欠点は、Nick Meyer と Martin York によって指摘されました。
- ユーザーはロックを解除してからバッファを使用できます。
- ロックを解放する前に例外が発生した場合、バッファーはロックされたままになります。
CSingleLock
オブジェクトが範囲外になったときにバッファのロックを解除するオブジェクト(または同様のもの)でそれを行いたいと思います。
どうすればそれができますか?