2010-11-29 80 views
2

關於多線程編程的一個簡單問題:我有一個由主線程讀取並由另一個線程設置的NSMutableArray實例變量。我目前使用這樣的:這裏需要「原子」嗎?

@property (nonatomic, retain) NSMutableArray *locations; 

但我想我現在已經刪除了「非原子」的指令?

回答

3

如果您創建一個新的數組並將其分配給位置,那麼yes會需要atomic屬性。

如果您打算從其他線程添加/刪除位置對象,則陣列上的原子屬性不適用。各種NSMutable ...集合不是線程安全的,因爲add/insert/remove方法不能被設計爲從多個線程中調用。

看到這麼一個問題:NSMutableDictionary thread safety

一個更好的辦法可能是有其他線程發送主線程的位置陣列添加或刪除,這樣的變化僅在主線程上發生。

0

「非原子」不是線程安全的。看看這個SO問題:

iPhone SDK Nonatomic and Atomic

它大多數情況下,你會不會有問題留下的財產作爲非原子。我幾乎從不需要使用原子,我的所有應用程序都使用某種多線程。

0

IMO的正確方法是將所有屬性保留爲原子,除非通過分析代碼顯示出明顯的性能問題。

但是,在這種情況下,這將無濟於事,因爲使屬性原子化並不會使NSMutableArray線程的內部狀態變得安全。您需要使屬性原子引入某種同步來阻止一個線程修改數組(即添加或除去對象),而另一個線程正在訪問它。由於這是非常棘手的強制執行,我可能不會公開數組作爲屬性。我會在父對象上的方法是這樣的:

-(void) addLocation: (id) newLocation; 
-(id) locationAtIndex: (NSUInteger) index; 

等類似的NSMutableArray方法,他們都會被同步。如果有一個返回整個數組的屬性,它將是隻讀的,並且會返回實數組的不可變副本。