例えば
EnterCriticalSection ( cs );
LeaveCriticalSection ( cs );
関数呼び出しを呼び出すか、オブジェクトを離れると、それをロックして解放する関数を作成したいと考えています。
クラスのワークアウトを開始するにはどうすればよいですか?
例えば
EnterCriticalSection ( cs );
LeaveCriticalSection ( cs );
関数呼び出しを呼び出すか、オブジェクトを離れると、それをロックして解放する関数を作成したいと考えています。
クラスのワークアウトを開始するにはどうすればよいですか?
では、スコープ付きの CriticalSection ですか?
class ScopedCriticalSection {
CRITICAL_SECTION cs;
ScopedCriticalSection()
{
if (!InitializeCriticalSectionAndSpinCount(&cs, 0x00000400))
throw std::runtime_error("Could not initialise CriticalSection object");
EnterCriticalSection(&cs);
}
~ScopedCriticalSection()
{
LeaveCriticalSection(&cs);
DeleteCriticalSection(&cs);
}
};
void foo()
{
ScopedCriticalSection scs;
/* code! */
}
またはBoost ミューテックスを検討してください。
Mutex
パブリック関数acquire
を使用してクリティカル セクションをクラスにラップし、構築時にミューテックスを取得して破棄時に解放するrelease
2 番目のクラスを呼び出すことができます。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
}