Разница между атомарной работой и безопасностью потока?

10

Из обсуждения, которое я видел, кажется, что атомарная работа и безопасность потоков - это одно и то же, но многие люди говорят, что они разные. Может кто-нибудь сказать мне разницу, если есть один?

user960567
источник
4
Атомарные операции помогут обеспечить безопасность потоков, но как они могут быть одинаковыми ? «Поток» - это не то же самое, что «операция».
user50849 10.12.12

Ответы:

11

Атомарные операции - это способ достижения безопасности потоков, используя некоторые виды блокировок, такие как мьютексы или семафоры, которые используют атомарные операции внутри, или реализуя синхронизацию без блокировок с использованием атомарных связей и ограждений памяти.

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

Да, написание одного из этих атомарных типов данных в c # является потокобезопасным, но это не делает функцию, которую вы используете, в потоке безопасной. Это только гарантирует, что одиночная запись выполняется правильно, даже если второй поток обращается к ней «одновременно». Тем не менее, при следующем чтении из текущего потока не гарантируется получение ранее записанного значения, так как другой поток мог записать в него только то, что считанное значение является допустимым.

Archy
источник
Являются ли int, bool, float потокобезопасными или атомарными?
user960567 10.12.12
1
@ user960567 - типы данных - это просто типы данных. Компилятор должен решить, как получить к ним доступ. Подумайте о int64 на 8086 процессоре.
mouviciel
2
В частности, в C # то, что вопрос помечен, чтение и запись должны быть атомарными для основных типов данных. См. Ecma 334
user50849 10.12.12
2
И да, написание одного из этих атомарных типов данных в c # является потокобезопасным, но это не делает функцию, которую вы используете, в потоке безопасной. Это только гарантирует, что одиночная запись выполняется правильно, даже если второй поток обращается к ней «одновременно». Тем не менее, при следующем чтении из текущего потока не гарантируется получение ранее записанного значения, так как другой поток мог записать в него только то, что считанное значение является допустимым.
Арчи
4
х = 5 является атомным в с #. Но сразу после этой операции его можно было перезаписать. x = x + 1 выполняется путем 1. загрузки x в регистр 2. увеличения x в регистре 3. сохранения x в памяти. Если второй поток выполняет одно и то же одновременно, оба загружают одно и то же значение, увеличивают его и сохраняют, в результате чего значение x увеличивается только один раз, а не дважды. InterlockedIncrement либо использует специальную инструкцию процессора для выполнения атомарного приращения, либо обеспечивает это с помощью механизма блокировки, например CAS, чтобы гарантировать, что пока новое значение не записано, никакой другой поток не сможет прочитать старое значение.
Арчи
3

Атомность и потокобезопасность - это две разные вещи. Атомность относится к качеству операции «все или ничего»; если операция не может быть выполнена на 100% успешно, то система должна оставаться в том состоянии, в котором она находилась до начала какой-либо части операции. Классический пример - транзакция базы данных; При сохранении счета, включая его заголовок и несколько позиций, каждая отдельная часть каждой строки базы данных должна быть успешно размещена; если нет, данные будут потеряны или повреждены. Если позиция не может быть вставлена, то не только не должны быть вставлены остальные оставшиеся строки, но и не должно остаться ни одной из уже обработанных строк.

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

Keiths
источник
2

Атомарная операция - это операция, которая не может быть прервана.

Безопасная нить - это нить, которую можно безопасно прервать.

Безопасность потоков достигается с помощью атомарных операций, в частности, в логике, которая предотвращает многократный доступ к критическим ресурсам.

Основной элементарной операцией является Test-and-set , который используется для реализации семафоров, которые, в свою очередь, используются для обеспечения безопасности потоков.

mouviciel
источник
Нельзя ли прервать многошаговую операцию и назвать ее атомарной, если она гарантированно откатит изменения?
user50849 10.12.12
1
Нет. Атомное следует понимать в его этимологическом значении: атомы, неделимые.
Mouviciel
Являются ли int, bool, float потокобезопасными или атомарными?
user960567 10.12.12
Но не существует разница между быть indivisble и появляясь неделимой к наблюдателю ? По вашему определению, не атомарная операция может содержать более одного шага. Я считаю, что слово «появляется» в определении атомной операции в Википедии имеет важное значение. (Я нахожусь в чате, если кто-то хочет поднять это там) :)
user50849
Есть одно большое отличие: безопасная нить может быть прервана, и нет гарантии, сколько времени. Это очень важно для вычислений в реальном времени. Атомарная операция (с блокировками прерываний, если она является многошаговой) гарантированно завершится через предсказуемый промежуток времени.
Mouviciel
1

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

Безопасность потоков относится к процессу, к которому могут обращаться отдельные потоки, когда доступ к одному (и манипулирование данными) не нарушает целостность работы другого.

Большая часть навыков программиста знает, как этого добиться, в зависимости от ситуации и ключевой цели, вам может потребоваться реализовать, например: блокировки, семафоры, защелки, атомарные объекты, правила синхронизации и т. Д ...

АДФ
источник