【问题标题】:Windows Condition Variable vs. EventWindows 条件变量与事件
【发布时间】: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


    【解决方案1】:

    此特定用例非常适合事件:它是一次性过程,必须唤醒所有等待的线程。

    条件变量更适合队列之类的东西,其中有一个关联的谓词,当等待线程唤醒时可能为真或不为真(例如队列中的项目 --- 它们可能已被另一个线程消耗) ,或者重要的是,唤醒的线程是在通知条件变量时已经在等待的线程之一,而不是之后出现的线程。

    另外,正如 Hans 所指出的,Windows 原生条件变量仅适用于 Vista 或更高版本,因此如果您担心与 Windows XP 的兼容性,则不能使用它们。

    【讨论】:

      【解决方案2】:

      对条件变量的支持需要 Vista 或更高版本。这通常是成本停止的地方,不幸的是,支持 XP 往往仍然很重要。您的第二个 sn-p 也确实具有相当大的优势,即易于理解。我不知道你在第一个中要做什么,它看起来不对。

      【讨论】:

        猜你喜欢
        • 2011-08-15
        • 1970-01-01
        • 2012-10-13
        • 2011-03-31
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        相关资源
        最近更新 更多