CRITICAL_SECTION / CONDITION_VARIABLE тупик в Win32 - PullRequest
1 голос
/ 03 ноября 2011

Почему этот код вызывает тупик?

РЕЗЬБА 1:

EnterCriticalSection( &lock_ );

... Create thread 1

EnterCriticalSection( &lock_ );
while (pred) {
    SleepConditionVariableCs( &cond_, &lock_ );
    // At this point, I would expect thread #2 to wake up, but it doesn't.
}
LeaveCriticalSection( &lock_ );
LeaveCriticalSEction( &lock_ );

РЕЗЬБА 2:

EnterCriticalSection( &lock_ );

// This never runs
... Do something else for a while

LeaveCriticalSection( &lock_ );

Согласно Win32 API, EnterCriticalSection можно вызывать два раза подряд из одного и того же потока без блокировки. Похоже, что SleepConditionVariableCS разблокирует критическую секцию только один раз, что означает, что поток № 2 никогда не будет работать. Правильно ли мое рассуждение здесь?

По сути, я хочу что-то вроде ReentrantLock Java. В чем разница между ReentrantLock и CRITICAL_SECTION?

1 Ответ

0 голосов
/ 03 февраля 2012

Похоже, что SleepConditionVariableCS разблокирует критическую секцию только один раз, что означает, что поток №2 никогда не будет работать.

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