Сравнение переменных состояния Windows и события

Мы можем использовать либо новый примитив условной переменной, либо событие Windows, чтобы синхронизировать потоки в WinNT v6.x или новее. Рассмотрим следующие два подхода: мы хотим, чтобы рабочие процессы выполнялись одновременно, когда в 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 .

Какой из них лучше на практике, только в отношении накладных расходов? (подсказка: переключение контекста , конфликт блокировки , накладные расходы на блокировку потоков )

Я бы выбрал первый, но чувствую недостаток обоснования.

6
задан Ajay 16 September 2013 в 09:29
поделиться