Я поддерживаю углеродное приложение 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);