我维持在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);
有帮助吗?

解决方案

不要使用自旋锁 - 自旋锁浪费CPU周期,循环不休,直到他们得到了锁。自旋锁应该只用于当该锁将被保持的时间会很短。

一个更好的选择是使用一个条件变量时,如在可用的那些并行线程库。这样一来,你的线程将休眠,直到条件满足再浪费CPU周期。查看在该链接对于如何使用并行线程条件变量列出的示例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top