2009-04-08 64 views
0

我維持在OS X的碳C++應用程序有一個「自旋鎖」在看起來代碼中的對象中的一個這樣,幫助與OSSpinLock *使用替換而(真){睡眠(1);}

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); 

回答

5

不要使用自旋鎖 - 自旋鎖會浪費CPU週期,直到他們獲得鎖定時循環不休。只有在鎖定時間非常短的情況下才能使用自旋鎖。

更好的選擇是使用condition variable,例如pthreads庫中的可用選項。這樣,線程就會休眠,不會浪費任何CPU週期,直到滿足條件。有關如何使用pthreads條件變量,請參閱該鏈接中列出的示例。

+0

根據應用程序的不同,自旋鎖可以比最終跳入內核或更糟糕的對象執行得更好,從而導致上下文切換。但是,這仍然是一組有限的應用程序,應謹慎使用。 – Torlack 2009-04-08 16:05:59