У меня есть эти два метода для потокового доступа к объекту 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
(или чем-то подобным), который разблокирует буфер, когда объект выходит за пределы области видимости.
Как это можно было сделать?