Помогите с использованием OSSpinLock * для замены while (true) {sleep (1);} - PullRequest
0 голосов
/ 08 апреля 2009

Я поддерживаю углеродное приложение C ++ в OS X. В одном из объектов в коде есть «спин-блокировка», которая выглядит следующим образом:

while ( mState != RELEASED )
{
    sleep( 1 );
}

Существует обратный вызов обслуживания после рендеринга, который передается в AudioUnitAddRenderNotify (), который устанавливает mState этих различных объектов.

Я думал об использовании встроенного семейства функций OSSpinLock для его замены (если ничего другого, потому что они поточно-ориентированы и приведенный выше код, похоже, не так).

Будет ли это разумным эквивалентом? Должен ли я также добавить защиту от блокировки в поток обслуживания, который управляет состоянием этих объектов?

OSSpinLock spin_lock = OS_SPINLOCK_INIT;

if (!OSSpinLockTry(&spin_lock))
    OSSpinLockLock(&spin_lock);

while (mState != RELEASED)
    OSSpinLockTry(&spin_lock);

OSSpinLockUnlock(&spin_lock);

1 Ответ

5 голосов
/ 08 апреля 2009

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

Лучшей альтернативой было бы использование условной переменной , например, доступной в библиотеке pthreads . Таким образом, ваш поток будет в спящем режиме и не будет тратить циклы ЦП до тех пор, пока условие не будет выполнено. См. Пример, приведенный в этой ссылке, чтобы узнать, как использовать условные переменные pthreads.

...