2012-08-10 63 views
1

我有兩個線程訪問同一組屬性,但一個只讀取屬性,另一個只寫入屬性。從不同的線程訪問屬性

以下哪些屬性需要同步讀取操作,哪些必須同步寫入操作?

@property (nonatomic) int myInt; 
@property (nonatomic) NSInteger myInteger; 
@property (nonatomic) CGImageRef cgImage; 
@property (nonatomic, strong) UIImage *image; 
@property (nonatomic, strong) NSMutableArray *array; 
@property (nonatomic, strong) UIViewController *controller; 

我的第一個直覺就是所有的讀寫操作都需要同步。但是,由於一個線程總是在寫,而另一個線程總是在讀,所以我不確定自己。當然,總是同步是「安全的」,因爲我不確定,但我想知道什麼是真正的正確?

出於某種原因,我有這種感覺,也許myInt和myInteger不需要同步讀取和寫入,因爲它們是通過值....?

回答

4

好吧,這就是原子屬性擅長的。如果它們都是原子的,那麼你可以讀取和寫入,而不會得到部分寫入的結果。

但是,我從來沒有發現真正有用的併發程序的原子objc屬性。我總是導致定期鎖定,不變性等等。

雖然你可以使用原子,但在實際情況下它並沒有太大的幫助。他們讓你的程序更多線程抵抗(不安全)在執行成本(都是壞的,順便說一句)。

順便說一句,通過價值在這裏真的不是一個問題。

突變一個可變值或對象(例如讀取,並從兩個線程從該寫入的NSMutableArray),和維持依賴於彼此是主要的問題實例變量的完整性。

說你是int型的(日,月)的兩個原子性質,他們有訪問器:維護兩個實例變量依賴於彼此的誠信

例子。如果讀取和寫入發生在不同的線程中,您需要的不僅僅是原子數來避免讀取無效日期(例如2月31日)。真正確保你的對象不在部分更新中的唯一方法是使用同步原語或不可變數據 - 這是基本的原子屬性不能保存你。

所以簡短的答案是'原子',但在併發的上下文中的對象很少如此簡單,原子的中間地帶是真正的線程安全

+0

我將在我的應用程序中使用的特定示例是,我有一個線程寫入和一個線程讀取的浮點數。這聽起來像是我最好的選擇是在這種情況下讓它成爲原子,而不用擔心同步它。在我的例子中,寫入線程是一個後臺線程,它會在更新的過程密集型任務的進度百分比,而讀線程是主線程,將更新與完成的百分比加載酒吧。 – MikeS 2012-08-10 18:18:04

+0

@MikeS如果它只是一個原子'float'財產,也沒有依賴性或副作用的特性改變,那麼「是」,這將確保您的讀取/寫入'通過存取方法float'從沒部分書面的國家。原子工作適合這個簡單的情況。這將適用於任何POD或合成的原子訪問器(它也爲您執行保留/自動釋放週期)。這是關於他們的效用的程度,我發現。 – justin 2012-08-10 18:24:18