2014-05-31 3 views
0

Учитывая следующий пример кода из СВД вики:Разница между «занят-ждать» бесконечного цикла и проверка состояния бесконечного цикла

SDL_bool condition = SDL_FALSE; 
SDL_mutex *lock; 
SDL_cond *cond; 

lock = SDL_CreateMutex(); 
cond = SDL_CreateCond(); 
. 
. 
Thread A: 
SDL_LockMutex(lock); 
while (!condition) { 
    SDL_CondWait(cond, lock); 
} 
SDL_UnlockMutex(lock); 

Thread B: 
SDL_LockMutex(lock); 
... 
condition = SDL_TRUE; 
... 
SDL_CondSignal(cond); 
SDL_UnlockMutex(lock); 

Почему считается более эффективно использовать условное ожидание (SDL_CondWait) то просто использовать inifnite глобальную переменную цикла, например:

while (!condition); 

это выглядит (для меня), что они оба заняты, ожидая переменной состояния, чтобы стать правдой, только разница в том, что цикл конд также проверяет, если другой поток 'сигнализировал' переменную cond.

ответ

3

Потому что ожидание переменной состояния является незанятым. Процессор фактически не выполняет никакой работы. Вместо этого поток простаивает, ожидая сигнала. Нить не получает ресурсов ЦП до тех пор, пока не будет сигнализировано условие.

Когда условие сигнализируется, поток снова становится подходящим, и планировщик может снова выделить ресурсы ЦП ему.

Контраст, что в петлю ожидания занятости, while (!condition), которая вращается в узкой петле, постоянно проверяя переменную condition.

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

См. Condition Variables для получения более подробной информации.

Смежные вопросы