我在哪裏我關注的對象屬性的線程安全的一個項目。我知道當一個屬性是一個對象,如NSString
,我可以遇到多線程同時讀寫的情況。在這種情況下,您可能會損壞讀取,並且應用程序可能會崩潰或導致數據損壞。
我的問題是爲原始值類型的性能如BOOL
S或NSInteger
秒。我想知道如果我可以進入一個類似的情況,當我從多個線程讀取和寫入時讀取一個損壞的值(並且應用程序將崩潰)?無論是哪種情況,我都對爲什麼感興趣。
澄清 - 17年1月13日
我在如果原始值類型屬性是不同易受崩潰最感興趣由於多個線程同時不是一個對象,如的NSMutableString訪問它,自定義創建的對象等。另外,如果在堆棧上訪問內存時相對於多線程而言存在差異。
澄清 - 17年12月1日
謝謝@Rob指着我的答案在這裏:stackoverflow.com/a/34386935/1271826!這個答案有一個很好的例子,表明取決於你所使用的體系結構的類型(32位與64位),當使用基本屬性時,你可以得到一個未定義的結果。
雖然這是對回答我的問題了一大步,我仍然不知道兩件事情:
- 如果有一個多線程的區別在棧上訪問原始值屬性時VS堆(如我先前提到澄清)?
- 如果限制一個程序在一個架構上運行,你還能發現自己在訪問的原始值屬性,爲什麼當一個不設防的狀態?
我應該注意到,在這個問題的回答中,圍繞原子vs非原子進行了大量的討論。雖然這通常是一個重要的概念,但這個問題與通過使用原子屬性修飾符或任何其他線程安全方法(如使用GCD)來防止未定義的多線程行爲無關。
使用原子屬性可避免讀取「損壞」值的任何機會。但它不一定避免閱讀「不正確的」值。 – rmaddy
對,我熟悉使用原子vs非原子,但正在讀取可能的原始值類型屬性的「損壞」值?如果是這樣,爲什麼? –
是的,這是可能的。如果您在32位目標上運行https://stackoverflow.com/a/34386935/1271826上的代碼,則會看到損壞的值。 – Rob