在win32中使用条件变量API唤醒多个线程的问题

时间:2010-10-29 17:17:39

标签: multithreading winapi condition-variable

我在理解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()调用。

我不确定我做错了什么,但我会在某处假设某些同步问题?

任何帮助将不胜感激。 (对不起,如果我重新发布不同着装的旧主题:)

1 个答案:

答案 0 :(得分:4)

你太晚了初始化cond_rwlock和start_condition变量。移动代码,之前启动线程。线程很可能立即开始运行,尤其是在多核机器上。

并测试api函数的返回值。你不知道为什么它不起作用,因为你从来没有检查过失。