Вопросанити свойства типа элементарного значения - Objective C
Я работаю над проектом, где я обеспокоен потокобезопасностью свойств объекта. Я знаю, что когда свойство является объектом, например NSString
, я могу столкнуться с ситуациями, когда несколько потоков одновременно читают и записывают. В этом случае вы можете получить поврежденное чтение, и приложение либо сбой, либо приведет к повреждению данных.
Мой вопрос касается свойств примитивного значения, таких как BOOL
s или NSInteger
s. Мне интересно, могу ли я попасть в аналогичную ситуацию, когда я читаю коррумпированное значение при чтении и записи из нескольких потоков (и приложение будет разбиваться)? В любом случае меня интересует, почему.
Разъяснение - 1/13/17
Я в основном заинтересован, если примитивный тип значение свойства по-разному восприимчивы к сбой из-за нескольких потоков к нему доступ в то же время, чем объект, такой как NSMutableString, пользовательский созданный объект и т. д. Кроме того, если есть разница при доступе к памяти в стеке против кучи относительно многопоточности.
Разъяснение - 12/1/17
Благодарим Вас @Rob за указание мне ответ здесь: stackoverflow.com/a/34386935/1271826! Этот ответ имеет отличный пример, который показывает, что в зависимости от типа архитектуры, в которой вы находитесь (32-разрядная версия с 64-разрядной версией), вы можете получить неопределенный результат при использовании свойства примитива.
Хотя это большой шаг к ответу на мой вопрос, я до сих пор удивляюсь две вещей:
- Если есть разница многопоточности, когда доступ к свойству примитивного значения в стеке против кучи (как указано в моем предыдущем уточнение)?
- Если вы ограничиваете работу программы на одной архитектуре, можете ли вы по-прежнему находиться в незащищенном состоянии, когда получаете доступ к первобытному значению свойства и почему?
Следует отметить, что в ответ на этот вопрос было много разговоров вокруг атомных против неатомических. Хотя это, как правило, важная концепция, этот вопрос имеет мало общего с предотвращением неопределенного многопотокового поведения с использованием модификатора атомного свойства или любого другого подхода к обеспечению безопасности потоков, такого как использование GCD.
Использование атомных свойств позволяет избежать каких-либо ошибок чтения «поврежденных» значений. Но не обязательно избегать чтения «неправильных» значений. – rmaddy
Правильно, я знаком с использованием атомных против неатомических, но читает «коррумпированное» значение для свойства примитивного типа значения? Если да, то почему? –
Да, это возможно. Если вы запустите код на странице https://stackoverflow.com/a/34386935/1271826 на 32-битной цели, вы увидите поврежденные значения. – Rob