クリティカルセクションに出たり入ったりするクラス
Effective C++ 第3版のを真似たつもりです。あの本ではミューティックスですが。
ソース
#include <windows.h> // クリティカルセクションに出たり入ったりするクラス class CLock { public: CLock( CRITICAL_SECTION *c) : m_critsec(c), m_unlocked(false) { ::EnterCriticalSection( m_critsec); } ~CLock() { UnLock(); } void UnLock() { if(! m_unlocked) { ::LeaveCriticalSection( m_critsec); m_unlocked = true; } } private: CRITICAL_SECTION *m_critsec; bool m_unlocked; };
使い方の例
CRITICAL_SECTION critsec; // 初期化処理などは省略 void func() { CLock cs( &critsec); // // 途中でスレッドが切り替わると困る処理はここに書く // }
LeaveCriticalSection関数を呼び忘れたとしても、CLockクラスがデストラクタでやってくれます。
途中でそれを呼びたい場合は、UnLockメソッドを呼び出します。