Переменная условия Windows и событие - PullRequest
6 голосов
/ 08 марта 2011

Мы можем использовать либо новую переменную условия примитив, либо событие 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 .

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

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

Ответы [ 2 ]

5 голосов
/ 08 марта 2011

Этот конкретный вариант использования идеально подходит для события: это однократный процесс, когда все ожидающие потоки должны быть разбужены.

Переменные условия лучше подходят для таких вещей, как очереди, где есть связанный предикатэто может быть или не быть правдой, когда ожидающий поток просыпается (например, элементы в очереди - они могли быть использованы другим потоком), или когда имеет значение, что пробужденный поток является одним из тех, которые уже ожидают, когда переменная условияуведомляется, а не тот, который приходит позже.

Плюс, как отметил Ханс, собственные переменные условия Windows работают только в Vista или более поздней версии, поэтому их нельзя использовать, если возникает проблема совместимости с Windows XP..

2 голосов
/ 08 марта 2011

Для поддержки условных переменных требуется Vista или выше.Это обычно, где доллар останавливается, поддержка XP, к сожалению, все еще важна.Ваш второй фрагмент также имеет значительное преимущество, которое тривиально понять.Я не имею понятия, что вы пытаетесь сделать в первом, это выглядит неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...