簡體   English   中英

非原子基元的原子性質與原子基元的非原子性質?

[英]Atomic property of a nonatomic primitive vs. nonatomic property of an atomic primitive?

我有一個關於屬性的問題,例如:

@property (atomic, assign) NSInteger variable;

是,如果我忘記了它的原子性,可以直接引用ivar並撤消該原子性。 但是,如果我聲明:

@property (nonatomic, assign) _Atomic(NSInteger) variable;

然后,無論我使用的是getter / setter還是訪問ivar,總是原子的,對嗎? 那么我們應該選擇后者嗎? 我的單線程基准測試表明這兩個設置程序的速度相似,盡管我不知道這是否會根據並發發生變化。

我不確定您的問題是否有明確的答案,但是由於在撰寫本文時沒有其他答案,我將提供以下內容,希望對您有所幫助。

在大約2009年的Objective-C 2.0中引入了已聲明的屬性以及nonatomic限定符(默認情況下,屬性是原子且不存在atomic_Atomic()來自C11,大約在2011年。

因此,我們有兩個獨立的語言開發解決原子性問題。

盡管沒有對Objective-C進行嚴格定義,但整個語言的最后“規范”可追溯到2009年,盡管此后有所擴展,但我不知道有任何規范討論C的原子特性與Objective-C的原子特性如何相互作用。 因此,與許多Objective-C問題一樣,這取決於編譯器的工作。

在針對Intel的當前Xcode 8.x編譯器看來,對於atomic_Atomic()所有組合,似乎都遵循尊重原子性的代碼,至少128位(此答案的測試限制_Atomic() –盡管同時指定兩者在某種程度上是多余的。 atomic產生的代碼更可能涉及自旋鎖,當然也涉及函數調用。 _Atomic() 更可能使用CPU交換指令並內聯編譯。

那么我們應該選擇后者嗎? [ _Atomic() ]

如果您打算使用直接訪問后備變量的方法,那么我將跳過任何關於優缺點的討論,否則可能會跳過。

如果您不打算直接訪問backing變量,則使用Atomic()可能會將一個自旋鎖調用交換為單個cpu指令,每個指令都有其自己的影響,因此任何優先選擇都取決於您如何權衡它們。

簡而言之:YMMV,以上內容適用於Intel,Xcode 8.x等。希望這是一些幫助,一個有趣的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM