帮助OSSpinLock*用法替换一段时间(true){sleep(1);}

0 c++ macos macos-carbon

我在OS X上维护一个Carbon C++应用程序.在代码中的一个对象中有一个"自旋锁",看起来像这样,

while ( mState != RELEASED )
{
    sleep( 1 );
}
Run Code Online (Sandbox Code Playgroud)

有一个后期渲染维护回调,它被提供给AudioUnitAddRenderNotify(),用于设置这些不同对象的mState.

我正在考虑使用内置的OSSpinLock系列函数来替换它(如果没有别的,因为它们是线程安全的,而上面的代码似乎不是).

这是一个合理的等价物吗?我是否还应该在维护线程中添加一些锁定保护来操纵这些对象的mState?

OSSpinLock spin_lock = OS_SPINLOCK_INIT;

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

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

OSSpinLockUnlock(&spin_lock);
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 5

不要使用自旋锁 - 自旋锁会浪费CPU周期,无休止地循环直到它们获得锁定.只有在锁定时间非常短的情况下才能使用自旋锁.

更好的选择是使用条件变量,例如pthreads库中可用的变量.这样,在满足条件之前,线程将休眠并且不会浪费任何CPU周期.有关如何使用pthreads条件变量的信息,请参阅该链接中列出的示例.