Из обсуждения, которое я видел, кажется, что атомарная работа и безопасность потоков - это одно и то же, но многие люди говорят, что они разные. Может кто-нибудь сказать мне разницу, если есть один?
c#
programming-languages
multithreading
user960567
источник
источник
Ответы:
Атомарные операции - это способ достижения безопасности потоков, используя некоторые виды блокировок, такие как мьютексы или семафоры, которые используют атомарные операции внутри, или реализуя синхронизацию без блокировок с использованием атомарных связей и ограждений памяти.
Таким образом, элементарные операции с примитивными типами данных являются инструментом для обеспечения безопасности потоков, но не обеспечивают автоматическую безопасность потоков, поскольку обычно у вас есть несколько операций, которые зависят друг от друга. Вы должны убедиться, что эти операции выполняются без перерыва, например, с использованием мьютексов.
Да, написание одного из этих атомарных типов данных в c # является потокобезопасным, но это не делает функцию, которую вы используете, в потоке безопасной. Это только гарантирует, что одиночная запись выполняется правильно, даже если второй поток обращается к ней «одновременно». Тем не менее, при следующем чтении из текущего потока не гарантируется получение ранее записанного значения, так как другой поток мог записать в него только то, что считанное значение является допустимым.
источник
Атомность и потокобезопасность - это две разные вещи. Атомность относится к качеству операции «все или ничего»; если операция не может быть выполнена на 100% успешно, то система должна оставаться в том состоянии, в котором она находилась до начала какой-либо части операции. Классический пример - транзакция базы данных; При сохранении счета, включая его заголовок и несколько позиций, каждая отдельная часть каждой строки базы данных должна быть успешно размещена; если нет, данные будут потеряны или повреждены. Если позиция не может быть вставлена, то не только не должны быть вставлены остальные оставшиеся строки, но и не должно остаться ни одной из уже обработанных строк.
Потокобезопасность относится к комбинации вещей, включая атомарность, которая позволяет операции быть «входящей»; несколько рабочих могут выполнять одну и ту же операцию, начиная в одно и то же или в другое время, не оказывая влияния ни на одну другую. Есть много моделей для работы с потоками; большинство из них сводятся концептуально к выполнению нескольких параллельных задач в полной изоляции (два рабочих могут выполнять одну и ту же задачу на двух разных объектах или коллекциях объектов, даже не зная, что другой работник вообще существует), или к созданию «конвейера», в котором каждый из нескольких рабочих выполняет одну задачу из всей операции (либо каждый рабочий переходит от первой задачи к следующей и т. д., либо же сосредотачивается на одной задаче и передает свой промежуточный «рабочий продукт» следующему работнику).
источник
Атомарная операция - это операция, которая не может быть прервана.
Безопасная нить - это нить, которую можно безопасно прервать.
Безопасность потоков достигается с помощью атомарных операций, в частности, в логике, которая предотвращает многократный доступ к критическим ресурсам.
Основной элементарной операцией является Test-and-set , который используется для реализации семафоров, которые, в свою очередь, используются для обеспечения безопасности потоков.
источник
Потокобезопасность - это скорее фреймворк или «концепция», атомарная операция - это подмножество, средство (одно из многих) достижения статуса как «поточно-ориентированного».
Безопасность потоков относится к процессу, к которому могут обращаться отдельные потоки, когда доступ к одному (и манипулирование данными) не нарушает целостность работы другого.
Большая часть навыков программиста знает, как этого добиться, в зависимости от ситуации и ключевой цели, вам может потребоваться реализовать, например: блокировки, семафоры, защелки, атомарные объекты, правила синхронизации и т. Д ...
источник