我有这两种方法的线程独占访问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