我們可以使用新的條件變量原語或Windows事件來同步WinNT v6.x或更高版本中的線程。考慮以下兩種方法,我們希望工作人員在main中設置「go」時同時運行,否則應全部阻止。Windows條件變量與事件
/*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醒來。在第二個,他們被阻止在WaitForSingleObject和醒了SetEvent。
哪一個在實踐中更好,只關於開銷? (提示:上下文切換,鎖爭,開銷阻塞線程)的
我會選擇第一個,但感覺缺乏理由的。