クリティカルセクションオブジェクトの非ブロッキングの例
説明:
TryEnterCriticalSection関数を使用することにより、クリティカルセクションオブジェクトの所有権獲得に失敗したときに待機せずに直ちに処理を戻す。
キーワード:
TryEnterCriticalSection, LeaveCriticalSection, Sleep, CreateThread, WaitForMultipleObjects, DeleteCriticalSection, CloseHandle
サンプルコード:
CRITICAL_SECTION g_section;
/* スレッド用関数
* “処理”の部分が、排他的な処理となる
* ThreadCount: 何番目のスレッドか
*/
DWORD WINAPI DoThread(DWORD ThreadCount)
{
int i;
for(i=0; i<3; i++) {
/* 所有権獲得まで待機 */
while(!TryEnterCriticalSection(&g_section)) {
printf("スレッド%d: 所有権取得失敗\n", ThreadCount);
Sleep(500);
}
printf("スレッド%d: 所有権取得成功\n", ThreadCount);
/* 処理 */
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;
HANDLE hDLL;
hDLL = LoadLibrary("kernel32.dll");
TryEnterCriticalSection = (void *)GetProcAddress(hDLL, "TryEnterCriticalSection");
/* クリティカルセクションオブジェクトの初期化 */
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 更新)
本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。