Вы можете обернуть критическую секцию в классе Mutex
открытыми функциями acquire
и release
и иметь второй класс с именем ScopedLock
, получив мьютекс при создании и освободив его при уничтожении.
Мьютекс:
class Mutex {
public:
Mutex() {
//TODO: create cs
}
~Mutex() {
//TODO: destroy cs
}
void acquire() {
EnterCriticalSection(cs);
}
void release() {
LeaveCriticalSection(cs);
}
private:
LPCRITICAL_SECTION cs;
Mutex(const Mutex&); //non-copyable
Mutex& operator=(const Mutex&); //non-assignable
};
Замок:
class ScopedLock {
public:
ScopedLock(Mutex* mutex_) : mutex(mutex_) {
mutex->acquire();
}
~ScopedLock() {
mutex->release();
}
private:
Mutex* mutex;
};
Используйте это так:
Mutex someMutex;
void foo() {
ScopedLock lock(&someMutex);
//critical stuff here
}
void bar() {
ScopedLock lock(&someMutex);
//other critical stuff here
}