Использование атомных свойств в Objective C: Любые побочные эффекты?

Я понимаю, что смысл atomic был объяснен в В чем разница между атомными и неатомическими атрибутами?, но я хочу знать:

Q. Существуют ли какие-либо побочные эффекты, помимо проблем с производительностью, при использовании атомных свойств везде?

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

Даже atomic не гарантирует безопасность потока, но он все же лучше, чем ничего, правильно?

Ответ 1

Даже атомный не гарантирует безопасность потока, но он все же лучше, чем ничего, правильно?

Wrong. Написав несколько действительно сложных параллельных программ, я рекомендую точно противоположное. Вы должны зарезервировать atomic, когда это действительно имеет смысл использовать, - и вы не можете полностью понять это, пока не будете писать параллельные программы без использования atomic. Если я пишу многопоточную программу, я не хочу, чтобы ошибки программирования маскировались (например, условия гонки). Я хочу, чтобы concurrency выдавал громкие и очевидные результаты. Таким образом, их легче идентифицировать, воспроизводить и исправлять.

Вера в то, что какая-то безопасность нитей лучше, чем ничто, ошибочна. Программа либо потокобезопасна, либо нет. Использование атома может сделать эти аспекты ваших программ более устойчивыми к проблемам, связанным с concurrency, но это вас мало не покупает. Конечно, там, вероятно, будет меньше аварий, но программа по-прежнему неоспоримо неправильно, и он до сих пор взрывают неисповедимы. Мой совет: если вы не собираетесь тратить время на изучение и запись правильных параллельных программ, просто держите их в одиночном режиме (если это звучит довольно грубо: это не должно быть суровым - это избавит вас от множества головных болей). Многопоточность и concurrency - это огромные, сложные предметы - требуется много времени, чтобы научиться писать действительно правильные, долгоживущие программы во многих областях.

Конечно, atomic можно использовать для обеспечения безопасности потоков в некоторых случаях, но каждый атом доступа не гарантирует ничего для безопасности потоков. Кроме того, очень необычно (статистически), что свойства atomic сами по себе сделают класс действительно поточным, особенно по мере увеличения сложности класса; более вероятно, что класс с одним иваром действительно безопасен, используя только атомику, по сравнению с классом с 5 иварами. atomic свойства - это функция, которую я использую очень редко (опять же, некоторые довольно большие кодовые базы и параллельные программы). Это практически угловой случай, если атоматика - это то, что делает класс действительно надежным в потоке.

Сложность выполнения и выполнения является основной причиной их избежания. По сравнению с неатомическим доступом, а также частота и простота доступа к переменной, использование атома складывается очень быстро. То есть, атомарные обращения приводят к большой сложности выполнения по сравнению с выполняемой задачей.

Замки спинов - это одномерные свойства атома. Итак, вы хотите, чтобы примитив синхронизации, такой как блокировка спина или мьютекса, неявно окружающий каждый get и set, зная, что это не гарантирует безопасность потока? Конечно, нет! Создание каждого доступа к свойствам в ваших реализациях атома может потреблять тонну процессорного времени. Вы должны использовать его только тогда, когда у вас есть явная причина сделать это (также упоминается dasblinkenlicht + 1). Детали реализации: некоторые обращения не требуют блокировки спина для обеспечения гарантий atomic; это зависит от нескольких вещей, таких как архитектура и размер переменной.

Итак, чтобы ответить на ваш вопрос "любой побочный эффект"? в формате TL; DR: производительность - это основная причина, о которой вы отметили, в то время как применимость каких атомных гарантий и как это полезно для вас, очень узка на вашем уровне абстракции (часто неправильно понимается), и она маскирует реальные ошибки.

Ответ 2

Вы не должны платить за то, что не используете. В отличие от подключенных компьютеров, где циклы процессоров обходятся вам с точки зрения времени, циклы процессоров на мобильном устройстве обойдутся как во времени, так и при использовании батареи. Если ваше приложение однопоточное, нет причин использовать atomic, поскольку операции блокировки и разблокировки будут пустой тратой времени и аккумулятора. Аккумулятор важнее времени: в то время как задержка, связанная с добавлением дополнительных операций, может быть невидимой для вашего конечного пользователя, проведенные циклы сократят время работы мобильного устройства после одного заряда, что мешает многим пользователи считают очень важным.