0

我在 OS X 上维护一个碳 C++ 应用程序。代码中的一个对象中有一个“自旋锁”,如下所示,

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

有一个提供给 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);
4

1 回答 1

5

不要使用自旋锁——自旋锁会浪费 CPU 周期,无休止地循环直到获得锁。只有当持有锁的时间非常短时,才应该使用自旋锁。

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

于 2009-04-08T15:58:06.080 回答