を使用したmutexのようなプログラムの作成。CriticalSection
EnterCriticalSection (cs);
LeaveCriticalSection (cs);
私はそれをロックする関数を作成し、関数呼び出しを呼び出すかオブジェクトを残す場合は解放したいと思います。
どのようにクラスを始めることができますか?
を使用したmutexのようなプログラムの作成。CriticalSection
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! */
}
またはconsider a Boost mutexです。
あなたは、公共の機能acquire
とrelease
でMutex
クラスのクリティカルセクションをラップし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
};
ロック:あなたのコンストラクタは、それがあなたに欠けている、引数として `LPCRITICAL_SECTION`を取る
Mutex someMutex;
void foo() {
ScopedLock lock(&someMutex);
//critical stuff here
}
void bar() {
ScopedLock lock(&someMutex);
//other critical stuff here
}
:
このようにそれを使用しますコード。 – LumpN
@ LumpN:良いスポット。修正しました。 –