クリティカルセクションに出たり入ったりするクラス

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メソッドを呼び出します。