複数のスレッド間の同期のためのイベントオブジェクト

イベントオブジェクトは自動的に状態が得られるリセットされたときに、オペレーティング・システム・イベント・オブジェクトがSetEvent(呼び出される、保護されたコードが実行されると、信号の状態に設定されている間だけスレッドが、スケジューリング状態になることがあり、シグナリング)シグナル状態にイベントオブジェクトを設定し、

明示的ResetEvent()関数は、無信号状態を設定呼び出さない限り、手動でリセットすることなく、イベントオブジェクトは、信号用に設定されています。

 

// Event.cpp:このファイルは、「メイン」機能が含まれています。プログラムの実行が開始され、ここで終了します。
//

#include "pch.h"
の#include <iostreamの>
の#include <windows.hに>


名前空間stdを使用。

DWORD WINAPI Fun1Proc(
LPVOID IpParameter
)。

DWORD WINAPI Fun2Proc(
LPVOID IpParameter
)。

int型のチケット= 100;
g_hEventをHANDLE。

メインINTは()
{
hThread1をHANDLE;
hThread2をハンドルと
; [10] = "チケット"名前チャー
CONST charが* ptrがNAME =;
// =でCreateEvent g_hEvent(NULL、FALSE、FALSE、NULL); //セキュリティレベル、手動かリセット(自動FALSE)、初期の非線形信号の状態、匿名
g_hEvent =でCreateEvent(NULL、FALSE、 FALSE、PTR); // 手動(自動FALSE)をリセットするかどうかを、セキュリティレベル、名前付き非線形信号の初期状態、
hThread1 = CreateThread(NULL、0、Fun1Proc、 NULL、0、NULL); // スレッド作成
hThread2 =のCreateThreadを(NULL、0、Fun2Proc、NULL、0、NULL);
CloseHandleを(hThread1);
CloseHandleを(hThread2)。

(g_hEvent)は状態判定のいくつかの例を挙げる//場合は
{
(GetLastErrorを==を()ERROR_ALREADY_EXISTS)のIF
{
COUTは<<てendl << "インスタンスが1つだけ実行することができます!";
-1を返す;
}
}
SetEventを(g_hEventを) ; //にイベント信号状態オブジェクト
スリープ(4000);
CloseHandleを(g_hEvent);
}
//マニュアルリセット状態は、次のすべてのスレッドをスケジュールすることができるように、制御不能;
//自動リセット状態、唯一のスレッドオペレーティングシステムが非線形状態に設定されている間、それは、スケジュールされてもよい;
DWORD WINAPI Fun1Proc(LPVOID IpParameter)
{
一方(TRUE)
{
のWaitForSingleObject(INFINITEのg_hEvent);
// ResetEvent(g_hEvent); //ステータス要求信号の後非線形にイベントオブジェクト
IF(チケット> 0)
{
スリープにおける(1)、
COUT << "スレッド1が販売している!!!"チケット<< << ENDL;
ticket--と、
SetEvent(g_hEvent); //イベントオブジェクトは状態信号に設定されている
}

{
BREAK;
}

}
戻り0;
}

WINAPI Fun2Proc DWORD(LPVOID IpParameter)
{
一方(TRUE)
{
のWaitForSingleObject(INFINITEのg_hEvent);
// ResetEvent(g_hEvent); //非線形にイベントオブジェクト後の状態へ要求信号
IF(チケット> 0)
{
スリープ( 1);
COUT << "販売スレッド2です!"チケット<< << ENDL;
ticket--、
SetEvent(g_hEvent); //イベントオブジェクトは状態信号に設定されている
}

{
BREAK;
}
}
戻り0;
}

おすすめ

転載: www.cnblogs.com/asce/p/11108804.html