名前無しセマフォの例
説明:
同時に3つまでしか起動できないスレッドの排他制御を、名前の無いセマフォオブジェクトを用いて実装する。
キーワード:
WaitForSingleObject, Sleep, ReleaseSemaphore, CreateSemaphore, CreateThread, WaitForMultipleObjects, CloseHandle
サンプルコード:
/* セマフォオブジェクトのハンドル */
HANDLE g_hSemaphore;
/* 1度に3つまでしか実行できないスレッド関数 */
DWORD WINAPI DoThread(DWORD ThreadCount)
{
/* 待機 */
WaitForSingleObject(g_hSemaphore, INFINITE);
/* 処理 */
printf("スレッド%d: 処理開始\n", ThreadCount);
Sleep(1000);
printf("スレッド%d: 処理終了\n", ThreadCount);
/* 後処理 */
ReleaseSemaphore(g_hSemaphore, 1, NULL);
return(0);
}
/* メイン関数 */
int main(int argc, char **argv)
{
HANDLE hThread[5];
int i;
/* セマフォオブジェクトの作成 */
g_hSemaphore = CreateSemaphore(NULL, 3, 3, NULL);
/* スレッドを5つ作成 */
for(i=0; i<5; i++) {
hThread[i] = CreateThread(
NULL, 0, (LPTHREAD_START_ROUTINE)DoThread,
(LPVOID)i, 0, NULL);
Sleep(100);
}
/* スレッドの終了まで待機 */
WaitForMultipleObjects(5, hThread, TRUE, INFINITE);
/* 後処理 */
CloseHandle(g_hSemaphore);
for(i=0; i<5; i++) CloseHandle(hThread[i]);
return(0);
}
(original text:1998/12/25 更新)
本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。