EnterCriticalSection クリティカルセクションオブジェクトの所有権要求

Cの宣言:

VOID EnterCriticalSection(LPCRITICAL_SECTION Section)

説明:

Sectionで示されるクリティカルセクションオブジェクトの所有権を要求する。他のスレッドがSectionで示されるクリティカルセクションオブジェクトを所有している場合、所有権が解放されるまで待機する。

スレッド間の排他制御を行いたい場合、排他処理開始にEnterCriticalSectionを、排他終了にLeaveCriticalSectionを実行する。ただし、異なるプロセス間での排他制御はできない。

本関数実行前に必ずInitializeCriticalSection関数によってクリティカルセクションオブジェクトを初期化しなければならない。

引数の意味は、以下の通り。
Section クリティカルセクションオブジェクトへのポインタ

Cのサンプル:

CRITICAL_SECTION g_section;

/* スレッド用関数
* “処理”の部分が、排他的な処理となる
* ThreadCount: 何番目のスレッドか
*/
DWORD WINAPI DoThread(DWORD ThreadCount)
{
	int i, j;

	for(i=0; i<3; i++) {
		/* 所有権獲得まで待機 */
		EnterCriticalSection(&g_section);

		/* 処理 */
		printf("スレッド%d: 処理開始\n", ThreadCount);
		Sleep(3000);
		printf("スレッド%d: 処理終了\n", ThreadCount);

		/* 開放 */
		LeaveCriticalSection(&g_section);
	}
        
	return(0);
}

/* メイン関数
* 排他処理に用いるクリティカルセクションオブジェクトを初期化
* スレッドを作成
* スレッドの終了を待機
*/
int main(int argc, char **argv)
{
	HANDLE hThread[2];
	DWORD ThreadID[2];
	int i;

	/* クリティカルセクションオブジェクトの初期化 */
	InitializeCriticalSection(&g_section);

	/* スレッドを2つ作成 */
	for(i=0; i<2; i++) {
		hThread[i] = CreateThread(
			NULL, 0, (LPTHREAD_START_ROUTINE)DoThread,
			(LPVOID)i, 0, &ThreadID[i]);
		Sleep(1000);
	}

	/* スレッドの終了まで待機 */
	WaitForMultipleObjects(2, hThread, TRUE, INFINITE);


	/* 後処理 */
	DeleteCriticalSection(&g_section);

	CloseHandle(hThread[0]);
	CloseHandle(hThread[1]);

	return(0);
}

(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。