簡體   English   中英

目標c中的非原子和原子線程不安全嗎?

[英]are nonatomic and atomic thread unsafe in objective c?

我讀到非原子和原子都是線程不安全的。 但是非原子的速度更快,因為它允許更快的異步訪問方式,而原子的速度慢,它允許同步的慢速訪問。

目標C中的atomic屬性保證您永遠不會看到部分寫入。

也就是說,如果兩個線程同時寫入值A和B以相同的變量X,然后在該相同的變量一個並行讀要么產生X,或者A或B的初始值隨着nonatomic這樣的保證不再給出。 您可能會得到任何值,包括從未顯式寫入該變量的值。

這是因為使用nonatomic ,讀取線程可能會在另一個線程正在寫入變量的同時讀取該變量。 因此,您閱讀的內容的一部分來自舊值,而另一部分則來自新值。

關於它們都是線程不安全的評論是指這樣的事實:除了此以外,沒有其他任何保證。 Apple的文檔在此提供以下示例:

考慮一個XYZPerson對象,其中使用一個線程中的原子訪問器來更改一個人的名字和姓氏。 如果另一個線程同時訪問兩個名稱,則原子獲取方法將返回完整的字符串(不會崩潰),但不能保證這些值相對於彼此是正確的名稱。 如果在更改之前訪問了名字,但在更改之后訪問了姓氏,那么您將得到一對不一致且不匹配的名稱。

純粹主義者可能會認為線程安全的定義過於嚴格。 從技術上講, atomic已經負責數據競爭和排序,這是從語言設計者的角度來看所需的全部。

另一方面,從應用程序邏輯的角度來看,上述名字-姓-名示例顯然構成了一個錯誤。 需要額外的同步來擺脫不希望的行為。 在此特定於應用程序的視圖中, XYZPerson類不是線程安全的。 但是在這里,我們談論的是與語言設計者所不同的線程安全級別。

暫無
暫無

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

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