ИМХО, если ваша цель состоит в том, чтобы запретить пользователю доступ к буферу только тогда, когда он заблокирован, вы вступаете в сложную битву. Подумайте, делает ли пользователь:
void someFunction(CSomeClass & sc)
{
CMyBuffer & buffer = sc.LockBuffer();
sc.ReleaseBuffer();
buffer.someMutatingMethod(); // Whoops, accessed while unlocked!
}
Чтобы предоставить пользователю доступ к буферу, вы должны вернуть ссылку на буфер, которую они всегда могут допустить, удерживая до тех пор, пока не будет снята блокировка.
Тем не менее, вы можете сделать что-то вроде этого:
class CMyBuffer
{
private:
void mutateMe();
CCriticalSection m_CritSec;
friend class CMySynchronizedBuffer;
};
class CMySynchronizedBuffer
{
private:
CMyBuffer & m_Buffer;
CSingleLock m_Lock
public:
CMySynchronizedBuffer (CMyBuffer & buffer)
: m_Buffer (buffer)
, m_Lock (&m_Buffer.m_CritSec, TRUE)
{
}
void mutateMe()
{
m_Buffer.mutateMe();
}
};
Используйте как:
{
CMyBuffer buffer; // Or declared elsewhere
// buffer.mutateMe(); (Can't do this)
CMySyncrhonizedBuffer synchBuffer (buffer); // Wrap it & lock it
synchBuffer.mutateMe(); // Now protected by critical section
} // synchBuffer and its CSingleLock member are destroyed and the CS released
Это вынуждает пользователя обернуть объект CMyBuffer в объект CMySynchronizedBuffer, чтобы получить доступ к любому из его методов мутации. Поскольку на самом деле он не предоставляет доступ к базовому объекту CMyBuffer путем возврата ссылки, он не должен давать пользователю ничего, за что можно зависнуть и изменить его после снятия блокировки.