我有这两种方法可以对对象进行线程独占访问CMyBuffer
:
标题:
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();
}
- 我喜欢的是,用户只需要进行一次函数调用,并且只能在锁定缓冲区后访问它。
- 我不喜欢的是用户必须明确释放。
更新:Nick Meyer 和 Martin York 指出了这些额外的缺点:
- 用户能够释放锁,然后使用缓冲区。
- 如果在释放锁之前发生异常,则缓冲区保持锁定状态。
我想用一个CSingleLock
对象(或类似的东西)来做,当对象超出范围时解锁缓冲区。
那怎么可能呢?