WinNT v6.x 以降でスレッドを同期するために、新しい条件変数プリミティブまたは Windows イベントのいずれかを使用できます。次の 2 つのアプローチを検討してください。main で「go」が設定されている場合はワーカーを同時に実行する必要があります。それ以外の場合は、すべてブロックする必要があります。
/*language C code*/
/*Windows Condition Variable*/
int go=0;
CONDITION_VARIABLE cv;
SRWLOCK lock;
void workers()
{
AcquireSRWLockShared(&lock);
if(go==0)
{
SleepConditionVariableSRW(&cv, &lock, INFINITE, CONDITION_VARIABLE_LOCKMODE_SHARED);
}
ReleaseSRWLockShared(&lock);
/*
Workers continue...
*/
}
void main()
{
int i;
InitializeConditionVariable(&cv);
InitializeSRWLock(&lock);
for(i=0;i<10;i++)
{
CreateThread(0, 0, workers, 0, 0, 0);
}
AcquireSRWLockExclusive(&lock);
go=1;
ReleaseSRWLockExclusive(&lock);
WakeAllConditionVariable(&cv);
}
また
/*language C code*/
/*Windows Event*/
HANDLE go;
void workers()
{
WaitForSingleObject(go, INFINITE);
/*
Workers continue...
*/
}
void main()
{
int i;
go=CreateEvent(0,1,0,0); /*No security descriptor, Manual Reset, initially 0, no name*/
for(i=0;i<10;i++)
{
CreateThread(0, 0, workers, 0, 0, 0);
}
SetEvent(go);
}
最初のアプローチでは、ワーカーは SleepConditionVariableSRW でブロックされ、WakeAllConditionVariableで起動されます。2 つ目では、 WaitForSingleObjectでブロックされ、 SetEventによって起動されます。
オーバーヘッドに関してのみ、実際にはどちらが優れていますか? (ヒント:コンテキスト スイッチ、ロック競合、ブロッキング スレッドのオーバーヘッド)
私は最初を選びますが、正当化の欠如を感じます。