Использование атомарных свойств в Задаче C: есть ли побочные эффекты?
Я понимаю, что смысл atomic
было объяснено в чем разница между атомарными и неатомарными атрибутами?, но я хочу знать это:
В. Есть ли какие-либо побочные эффекты, помимо проблем с производительностью, при использовании атомарных свойств везде?
Кажется, ответ - нет, так как производительность iPhone в наши дни довольно высокая. Так почему же так много людей все еще используют non-atomic
?
Четное atomic
не гарантирует безопасность потоков, но все же лучше, чем ничего, верно?
2 ответа
Даже атомарный не гарантирует безопасность потоков, но все же лучше, чем ничего, верно?
Неправильно Написав несколько действительно сложных параллельных программ, я рекомендую с точностью до наоборот. Вы должны зарезервировать atomic
когда это действительно имеет смысл использовать - и вы не можете полностью понять это, пока вы не пишете параллельные программы без какого-либо использования atomic
, Если я пишу многопоточную программу, я не хочу маскировать ошибки программирования (например, условия гонки). Я хочу, чтобы проблемы параллелизма были громкими и очевидными. Таким образом, их легче идентифицировать, воспроизвести и исправить.
Мнение о том, что безопасность некоторых потоков лучше, чем ничего, ошибочно. Программа либо поточна, либо нет. Использование Atomic может сделать эти аспекты ваших программ более устойчивыми к проблемам, связанным с параллелизмом, но это мало что дает вам. Конечно, там, вероятно, будет меньше аварий, но программа по-прежнему неоспоримо неправильно, и он до сих пор взрывают неисповедимы. Мой совет: если вы не собираетесь тратить время на изучение и написание правильных параллельных программ, просто держите их однопоточными (если это звучит довольно резко: это не значит, что это резко - это избавит вас от многих головных болей)). Многопоточность и параллелизм - это огромные, сложные предметы - требуется много времени, чтобы научиться писать действительно правильные, долговечные программы во многих областях.
Конечно, atomic
в некоторых случаях может использоваться для обеспечения безопасности потоков, но создание любого атомарного доступа ничего не гарантирует для безопасности потоков. Кроме того, весьма необычно (статистически), что atomic
одни только свойства сделают класс по- настоящему безопасным для потоков, особенно с ростом сложности класса; более вероятно, что класс с одним иваром действительно безопасен только с использованием атомики, в отличие от класса с 5 иварами. atomic
свойства - это функция, которую я использую очень редко (опять же, некоторые довольно большие кодовые базы и параллельные программы). Это практически угловой случай, если атомарность - это то, что делает класс действительно потокобезопасным.
Производительность и сложность исполнения являются основными причинами, чтобы избежать их. По сравнению с неатомарным доступом, частотой и простотой доступа к переменной, использование атомарного доступа складывается очень быстро. То есть атомарный доступ представляет большую сложность выполнения по отношению к задаче, которую они выполняют.
Спин-блокировки являются одним из способов реализации атомарных свойств. Итак, хотите ли вы примитив синхронизации, такой как спин-блокировка или мьютекс, неявно окружающий каждое получение и установку, зная, что он не гарантирует безопасность потока? Я, конечно, нет! Создание атомарного доступа к каждому свойству может потреблять массу процессорного времени. Вы должны использовать его только тогда, когда у вас есть явная причина для этого (также упомянутое dasblinkenlicht+1). Подробная информация о реализации: некоторые доступы не требуют блокировки вращения для поддержки гарантий atomic
; это зависит от нескольких вещей, таких как архитектура и размер переменной.
Таким образом, чтобы ответить на ваш вопрос "какой-либо побочный эффект?" в формате TL;DR: производительность является основной причиной, как вы отметили, в то время как применимость того, что атомарные гарантии и как это полезно для вас, очень узка на вашем уровне абстракции (часто неправильно понятом), и она маскирует реальные ошибки.
Вы не должны платить за то, что вы не используете. В отличие от подключенных компьютеров, где циклы ЦП обходятся вам с точки зрения времени, циклы ЦП на мобильном устройстве обходятся вам как во времени, так и в использовании батареи. Если ваше приложение однопоточное, нет причин использовать atomic
потому что операции блокировки и разблокировки были бы пустой тратой времени и батареи. Батарея важнее, чем время: в то время как задержка, связанная с добавлением дополнительных операций, может быть незаметна для вашего конечного пользователя, затраченные циклы уменьшат время, в течение которого мобильное устройство может работать после одной зарядки, что очень много. пользователи считают очень важным.