【发布时间】:2011-03-08 14:18:11
【问题描述】:
我们可以使用新的条件变量原语或 windows 事件来同步 WinNT v6.x 或更高版本中的线程。考虑以下两种方法,我们希望worker在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 唤醒。第二个,它们被 WaitForSingleObject 阻塞并被 SetEvent 唤醒。
仅在开销方面,哪一个在实践中更好? (提示:上下文切换,锁竞争,阻塞线程的开销)
我会选择第一个,但觉得缺乏理由。
【问题讨论】:
标签: c windows multithreading condition-variable readerwriterlockslim