Имам тези два метода за изключителен достъп до 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();
}
- Това, което ми харесва в това е, че потребителят трябва да направи само едно извикване на функция и може да получи достъп до буфера само след като го е заключил.
- Това, което не ми харесва е, че потребителят трябва да освободи изрично.
Актуализация: Тези допълнителни недостатъци бяха посочени от Ник Майер и Мартин Йорк:
- Потребителят може да освободи заключването и след това да използва буфера.
- Ако възникне изключение преди освобождаване на заключването, буферът остава заключен.
Бих искал да го направя с CSingleLock
обект (или нещо подобно), което отключва буфера, когато обектът излезе извън обхвата.
Как би могло да стане това?