«атомные» свойства против безопасности потоков - PullRequest
1 голос
/ 29 октября 2019

Мне кажется, я понимаю поведение атомарных свойств (и неатомарных), но меня несколько смущает частая ссылка на то, что атомарность "не гарантирует безопасность потоков" . Это утверждение, сделанное часто в контексте объяснения атомарных свойств, немного смущает меня, потому что, на мой взгляд, в явном смысле безопасность потока в свойстве это именно то, что выполучение (хотя и не более).

Насколько я понимаю,

  • atomic свойство (которое по умолчанию по сравнению с явнымnonatomic) гарантированно никогда не считывает значение мусора из-за нескольких потоков записи. Другими словами, если запись самого значения требует нескольких шагов (например, запись нескольких слов в памяти), эта запись будет атомарной. Таким образом, чтение свойства из данного потока всегда будет отражать значение, которое было записано полностью в некоторый момент в прошлом, хотя, конечно, последующее чтение может показывать некоторое другое значение.

  • Если чтение (или даже запись) свойства является частью операции, которая требует каких-либо дополнительных гарантий, например, обновления двух свойств, которые семантически связаны, или необходимости воздействовать натекущее значение свойства, которое должно считаться постоянным до тех пор, пока действие не будет завершено - тогда требуется дополнительная блокировка или синхронизация со стороны программиста, чтобы общая семантика была поточно-ориентированной.

Другими словами, написание и чтение самого атомарного свойства фактически является «поточно-ориентированным» (защищенным от повреждения несколькими авторами), но, конечно, эта защита не распространяется на более широкую логику.

  1. Это точное понимание?
  2. При каких обстоятельствах свойство atomic действительно полезно? Я мог бы придумать несколько простых примеров, когда свойство - это своего рода счетчик или изменяющийся объект, который не должен отражать текущее состояние и т. Д., Но они кажутся необычными по сравнению с многопоточными сценариями, где вам действительно нужна явная блокировка доступа - в которыхЕсли бы вы могли просто использовать nonatomic для фактического свойства все время.
  3. Почему именно люди постоянно говорят, что атомарность не «гарантирует безопасность потоков»? Это кажется верным только в том случае, если NSLock не гарантирует безопасность потока или synchronized не гарантирует безопасность потока - предупреждение для непосвященных? В противном случае это кажется запутанным обозначением, поскольку сам смысл этих механизмов синхронизации заключается в том, что они предназначены для использования в поточно-ориентированном проектировании и, как известно, надежны в своей проектной работе.

Ответ Роба Нейпира здесь предполагает согласие с # 2 выше. Был бы признателен, если бы кто-то хорошо разбирался в практическом использовании atomic, чтобы сообщить мне, если у меня есть правильная идея здесь.

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Другими словами, запись и чтение самого свойства atomic фактически является «поточно-ориентированным» (защищенным от повреждения несколькими авторами), но, конечно, эта защита не распространяется на более широкие возможности. логика.

  1. Это точное понимание?

Во многом да.

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

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

Они могут быть полезны при работе с примитивными типами данных в определенных сценариях (например, свойство логического состояния, обозначающее, является ли какой-либо фоновым)процесс закончен). Они также могут быть полезны в особых случаях, когда вы имеете дело с неизменяемыми объектами без состояния.

Но в большинстве многопоточных сценариев свойства atomic обычно не обеспечивают безопасность потоков.

Почему именно люди постоянно говорят, что атомарность не «гарантирует безопасность потоков»? Это кажется верным только в том случае, если NSLock не гарантирует безопасность потока или синхронизированный не гарантирует безопасность потока - предупреждение для непосвященных? В противном случае это кажется запутанным обозначением, поскольку сам смысл этих механизмов синхронизации заключается в том, что они предназначены для использования в поточно-ориентированном проектировании и, как известно, надежны в своей проектной работе.

Мы делаемэто потому, что были люди (например, https://stackoverflow.com/a/17571453/1271826), которые ошибочно полагают, что свойства atomic обеспечивают безопасность потоков, когда это почти всегда не удается сделать. В свое время казалось, что когда-то задают вопрос о безопасности потоковкто-то мог бы присоединиться к «о, используйте atomic свойства». Казалось, что существует постоянное смешение «безопасности потоков» и скромной защиты от коррупции, которую предлагает atomic.

Итак, да,«Не имеет ничего общего с безопасностью потоков» является немного сильным, но в подавляющем большинстве случаев атомарные свойства не могут обеспечить безопасность потоков и при наличии правильно реализованной синхронизации (такой как блокировки, @synchronized, GCD и т. Д. .), просто введите ненужные накладные расходы.

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

0 голосов
/ 29 октября 2019

Это не потокобезопасно, это означает, что если поток A обращается к вашей переменной, то поток B, C, D также может обращаться к ней и вносить в нее изменения. Таким образом, в конце потока A неизвестно, что содержит переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...