2017-02-20 22 views
3

Я уже видел этот вопрос:
What's the difference between the atomic and nonatomic attributes?Когда использовать @atomic?

Я понимаю, что @atomic не гарантирует поточно, и я должен использовать другие механизмы (например, @synchronized), чтобы понять, что. Исходя из этого, я до сих пор не знаю ТОЧНО, когда использовать атрибут @atomic. Я хотел бы знать USE CASE использования @atomic.

+1

Когда вы говорите '@ atomic', вы имеете в виду объявление атомного свойства (например,' @property (atomic, strong) NSString * string; ')? – Rob

+0

@Rob Да, я имею в виду это. – tofucodes

ответ

5

Типичный прецедент для свойств atomic - это дело с примитивным типом данных для нескольких потоков. Например, предположим, что у вас есть какой-то фоновый поток, выполняющий некоторую обработку, и у вас есть свойство состояния BOOL, например. isProcessComplete и ваш основной поток хотят, чтобы проверить, если фоновый процесс завершен:

if (self.isProcessComplete) { 
    // Do something 
} 

В этом случае, объявляя это свойство atomic позволяет использовать/обновлять эту недвижимость через несколько потоков без какого-либо более сложного механизма синхронизации потому что:

  • Мы имеем дело со скалярным примитивным типом данных, например BOOL;
  • мы объявили его atomic; и
  • мы используем метод доступа (например, self.) вместо прямого доступа к ivar.

При работе с объектами или другими более сложными ситуациями, atomic обычно недостаточно. Как вы заметили, на практике atomic, в одиночку, редко бывает достаточно для обеспечения безопасности потоков, поэтому мы не очень часто используем его. Но для простых, автономных примитивных типов данных atomic может быть простым способом обеспечить безопасный доступ к нескольким потокам.

+0

Does «Основной тип данных» означает «примитивные» типы данных? – tofucodes

+0

Я имею в виду скалярные типы данных C, те примитивные типы данных, которые состоят из одного значения или перечисления, использующего один из этих типов. Я имею в виду исключить составные или ссылочные типы, такие как объекты, C-массивы и C-структуры. – Rob

+0

получил это! Спасибо за ваш ответ – tofucodes

1

@atomic гарантирует, что ценность, которую вы получите, не будет тарабарщиной. Возможная ситуация - прочитать заданное значение из одного потока и установить его значение из другого. Затем ключевое слово @atomic гарантирует, что вы получите целое значение. Теперь важно то, что ценность, которую вы получаете, не гарантируется тем, что было установлено совсем недавно.

Вторая часть вашего вопроса, касающаяся прецедента, является чисто косвенным, в зависимости от реализации намерений. Например, если у вас есть какое-то временное обновление в списке каждую секунду или около того, вы можете использовать атомный, чтобы убедиться, что вы получите целые значения, а таймер, который обновляет ваш список, может гарантировать, что у вас будут последние данные на экране или под капотом в какой-то неявной логике.

EDIT: После замечания от @Rob я увидел необходимость перефразировать последнюю часть моего ответа. В большинстве случаев atomic недостаточно, чтобы выполнить эту работу. И есть потребность в лучшем решении, например @synchronized.

+5

Просто, чтобы уточнить, «значение ...не будет тарабарщины "имеет смысл, если иметь дело с фундаментальным типом данных, но если иметь дело с объектом, все это означает, что указатель на объект не является тарабарщиной, но не дает никаких гарантий относительно состояния самого объекта. Объект изменчив, тогда «атомный» дает небольшую выгоду. – Rob

+1

Моя точка зрения заключалась в том, что в большинстве случаев «атомного» недостаточно, и вы должны использовать другой способ, но я полностью согласен с вами, я отредактирую ответ. –