我在理解winapi条件变量如何工作方面遇到了问题。
在更具体的方面,我想要的是在某些条件下等待的几个线程。然后我想使用WakeAllConditionVariable()调用唤醒所有线程,以便它们可以工作。除了我只想要线程启动的事实,它们没有任何其他先决条件让它们开始工作(就像你在n producer / n消费者场景中那样)。
到目前为止,这是代码:
#define MAX_THREADS 4
CONDITION_VARIABLE start_condition;
SRWLOCK cond_rwlock;
bool wake_all;
__int64 start_times[MAX_THREADS];
主线程:
int main()
{
HANDLE h_threads[ MAX_THREADS ];
int tc;
for (tc = 0; tc < MAX_THREADS; tc++)
{
DWORD tid;
h_threads[tc] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_routine,(void*)tc,0,&tid);
if( h_threads[tc] == NULL )
{
cout << "Error while creating thread with index " << tc << endl;
continue;
}
}
InitializeSRWLock( &cond_rwlock );
InitializeConditionVariable( &start_condition );
AcquireSRWLockExclusive( &cond_rwlock );
// set the flag to true, then wake all threads
wake_all = true;
WakeAllConditionVariable( &start_condition );
ReleaseSRWLockExclusive( &cond_rwlock );
WaitForMultipleObjects( tc, h_threads, TRUE, INFINITE );
return 0;
}
以下是线程例程的代码:
DWORD thread_routine( PVOID p_param )
{
int t_index = (int)(p_param);
AcquireSRWLockShared( &cond_rwlock );
// main thread sets wake_all to true and calls WakeAllConditionVariable()
// so this thread should start doing the work (?)
while ( !wake_all )
SleepConditionVariableSRW( &start_condition,&cond_rwlock, INFINITE,CONDITION_VARIABLE_LOCKMODE_SHARED );
QueryPerformanceCounter((LARGE_INTEGER*)&start_times[t_index]);
// do the actual thread related work here
return 0;
}
这段代码没有按照我的期望去做。有时只有一个线程完成工作,有时两到三个,但绝不是全部。主函数永远不会通过WaitForMultipleObjects()调用。
我不确定我做错了什么,但我会在某处假设某些同步问题?
任何帮助将不胜感激。 (对不起,如果我重新发布不同着装的旧主题:)
答案 0 :(得分:4)
你太晚了初始化cond_rwlock和start_condition变量。移动代码,之前启动线程。线程很可能立即开始运行,尤其是在多核机器上。
并测试api函数的返回值。你不知道为什么它不起作用,因为你从来没有检查过失。