2010-07-22 38 views
3

我試圖在Objective-C中實現併發的actor模型,因爲我想避免共享可變狀態,鎖定,信號量等臭名昭着的問題。它可以完成,但它需要真實紀律,以避免意外使用共享狀態。是否可以在操作系統或編程語言級別實施無共享多線程? (OSX,Objective-C)

實施無共享規則的一種方法是使用單獨的進程而不是單獨的線程,但我認爲這是過度殺毒,並且會有令人討厭的開銷。我真正喜歡的是達到相同目標的東西,但是以更輕量級的方式。有什麼符合這個描述?

回答

1

不幸的是,你的問題的簡短答案是「不,沒有操作系統的設施可以強制共享 - 沒有比過程輕的重量。」從理論上講,這對於一個靜態分析工具(如clang)來說是一個有趣的方向,但我現在還沒有意識到任何這樣的工具。

這就是說,你有沒有仔細看看Grand Central Dispatch(又名libdispatch)和塊?

我自己的經驗是,GCD和塊顯着簡化了遵守無共享併發所需的規則。你在上面提到,你「已經熟悉NS操作,塊等」,但我建議你真正坐下來,探索你可以用它們做什麼。此外,調度API可能存在很多模式,這些模式在NSBlockOperation/NSOperationQueue抽象層之上很難實現,所以不要害怕鑽研底層的libdispatch API。

0

不要害怕文檔!以通過Concurrency Programming Guide

--Frank

+0

我已經熟悉NSOperation,塊等,這不回答我的問題。 – 2010-07-23 02:33:50

+0

然後,提供更好上下文的更簡潔的描述(場景)可能會有所幫助。 – 2010-07-24 12:23:01

0

你一個好的方法是消息傳遞一看NSOperation或更廣泛的理解。兩個演員或線程設置了他們之間的溝通渠道。這個頻道的語義可能很複雜或簡單。一個簡單的語義是消息是原子性寫入和原子消耗的。這可以用來實現無共享方法,並且是許多編程模型的首選方法。

這是Google的GO語言使用的模型。

1

ActorKit

這是一個小測試,但它的作品。應該給你一個啓動最壞情況的地方。

+0

謝謝,看起來很有趣。 – 2010-08-11 09:31:03

相關問題