0

我的iOS應用程序需要將數據從圖形線程發送到音頻線程。需要存儲這些數據包(表示要合成的聲音),直到音頻線程準備好對其執行操作爲止。顯而易見的數據結構是一個隊列,其中圖形線程推到頭部,音頻線程從尾部拉出。音頻線程正在實時運行,並且任何鎖都可能導致可聽到的故障。有沒有一個線程安全的方式來做到這一點沒有鎖?Objective-C中的無鎖消息隊列

我已經嘗試performSelector:onThread:withObject:waitUntilDone沒有運氣。我認爲這是因爲音頻線程沒有相關的運行循環。

在我看來,我可以在這裏構建一些類似於基於數組的環形緩衝區,它可以存放指向我的消息的指針,其中生產者線程負責移動寫入頭,並且消費者線程將處於移動讀取頭的電荷。我怎樣才能確保這樣的事情實際上是線程安全的? The wikipedia on non-blocking algorithms提到無鎖環形緩衝區可以在不使用低級(彙編)代碼的情況下實現,但是我對自己對線程如何共享機器控制權的瞭解還不夠自信,以確保我實現的實際上是線程-安全。

回答

1

聽起來像是NSOperationQueue的工作。

閱讀Apple的併發編程指南開始。

+0

我會試試這個。你可以設置NSOperationQueue的併發性爲1,爲你有效地創建一個串行隊列。 – 2011-03-27 07:04:07

0

時間限制並不像您想象的那麼重要。你有足夠的時間(在合理範圍內)提供緩衝區。

我建議你先實現一個常規鎖定隊列。這可能不會是一個問題。如果是這樣,它可能不會是鎖定將成爲瓶頸。我已經完成了大量的音頻內容,包括實現你想要做的許多變體,而不用使用鎖。

這就是說,我確定有一種方法可以使用OSAtomic.h中的原語實現無鎖定線程安全隊列。這是一個很好的blog post就可以了。