Різниця між атомною експлуатацією та безпекою нитки?


10

З дискусії, яку я бачив, схоже, що атомна робота та безпека ниток - це одне і те ж, але багато людей кажуть, що вони різні. Хтось може сказати мені різницю, якщо така є?


4
Атомні операції допоможуть забезпечити безпеку ниток, але як вони могли бути однаковими ? "Нитка" - це не те саме, що "операція".
user50849

Відповіді:


11

Атомні операції - це спосіб досягти безпеки ниток або за допомогою використання якихось замків, таких як Mutexes або Semaphores, які використовують атомні операції всередині, або впроваджуючи синхронізацію без блокування, використовуючи огорожі атоми та пам'яті.

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

Так, запис одного з цих типів атомних даних у c # є безпечним для потоків, але це не робить функцію, яку ви використовуєте в потоці, безпечною. Це лише забезпечує правильне виконання одного запису, навіть якщо другий потік отримує доступ до нього "одночасно". Не зважаючи на те, наступне зчитування з поточного потоку не забезпечується для отримання значення, записаного раніше, оскільки інший потік, можливо, записав до нього, лише те, що прочитане значення є дійсним.


Чи int, bool, float є потоками безпечними чи атомарними?
user960567

1
@ user960567 - типи даних - це саме такі: типи даних. Висновник, як отримати доступ до них, залежить від компілятора. Подумайте про int64 на процесорі 8086.
mouviciel

2
Зокрема в C #, що питання позначено тегами, читанням і записом, повинно бути атомним на основних типах даних. Дивіться Ecma 334
user50849

2
І так, запис одного з цих типів атомних даних у c # є безпечним для потоків, але це не робить функцію, яку ви використовуєте в потоці, безпечною. Це лише забезпечує правильне виконання одного запису, навіть якщо другий потік отримує доступ до нього "одночасно". Не зважаючи на те, наступне зчитування з поточного потоку не забезпечується для отримання значення, записаного раніше, оскільки інший потік, можливо, записав до нього, лише те, що прочитане значення є дійсним.
Архів

4
x = 5 - атомний в c #. Але відразу після цієї операції її можна було перезаписати. x = x + 1 виконується шляхом 1. завантаження x в регістр 2. збільшення x в регістр 3. збереження x в пам'ять. Якщо другий потік одночасно виконує те саме, обидва завантажують одне і те ж значення, збільшують його і зберігають його, в результаті чого х збільшується лише один раз, а не двічі. InterlockedIncrement або використовує спеціальну інструкцію процесора для виконання атомного приросту, або забезпечує це за допомогою механізму блокування, наприклад, CAS, щоб переконатися, що, поки нове значення не записується, жоден інший потік не може прочитати старе значення.
Архів

3

Атомність і безпека ниток - це дві різні речі. Атомність стосується якості операції "все або нічого"; якщо операція не може бути виконана на 100% успішно, система повинна залишатися в загальному стані, в якому вона була до початку будь-якої частини операції. Класичний приклад - транзакція з базою даних; Під час збереження рахунку-фактури, включаючи його заголовок та декілька позицій, кожну окрему частину кожного ряду баз даних необхідно успішно ввести; якщо ні, дані втрачаються або пошкоджуються. Якщо позицію неможливо вставити, то не тільки не повинні бути вставлені інші рядки, але жоден з уже оброблених рядків не повинен залишатися.

Під безпекою нитки розуміється поєднання речей, включаючи атомність, що дозволяє операції бути "відпочинкової"; кілька робітників можуть виконувати одну і ту ж операцію, починаючи в той самий або різний час, без впливу на будь-яку іншу. Існує багато моделей для безпечної роботи з нитками; більшість з них зводиться концептуально до виконання декількох паралельних завдань у повній ізоляції (два працівники можуть виконувати одне і те ж завдання на двох різних об'єктах або колекції предметів, не знаючи, коли інший працівник навіть існує), або встановлюючи "трубопровід", в рамках якого декілька робітників виконують одне завдання за всю операцію (або кожен працівник просувається від першого завдання до наступного тощо), або зосереджується на одному завданні і передає наступному працівникові свій проміжний «робочий продукт»).


2

Атомна операція - це операція, яку неможливо перервати.

Безпечна нитка - це нитка, яку можна безпечно перервати.

Безпека різьби досягається при атомних операціях, зокрема в логіці, яка запобігає багатократному доступу до критичних ресурсів.

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


Неможливо багатоступеневу операцію перервати та назвати атомною, якщо гарантовано повернути її зміни?
user50849

1
Ні. Атомне слід розуміти в його етимологічному значенні: ἄτομος, atomos, неподільний.
mouviciel

Чи int, bool, float є потоками безпечними чи атомарними?
user960567

Але не існує різниця між бути indivisble і з'являючись неподільної до спостерігачеві ? За вашим визначенням, атомна операція може містити більше, ніж один крок. Я вважаю, що слово "з'являється" у визначенні wikipedia щодо атомної роботи є важливим. (Я в чаті, якщо хто хоче піднести його туди) :)
user50849

Є одна велика різниця: безпечну нитку можна перервати, і немає гарантії, скільки часу. Це дуже важливо для обчислень у режимі реального часу. Атомна операція (із блокуваннями переривання, якщо вона є багатоступеневою), гарантовано припиняється через передбачуваний час.
mouviciel

1

Безпека ниток - це скоріше рамка або "концепція", атомна операція - це підмножина, засіб (один із багатьох) для досягнення статусу як класифікованого "безпечно для потоків".

Безпека нитки відноситься до процесу, до якого можна отримати доступ окремими потоками, де доступ до однієї (та маніпулювання даними) не може пошкодити цілісність роботи іншого.

Значна частина майстерності програміста - це знати, як цього досягти, залежно від ситуації та ключової мети, можливо, вам доведеться реалізувати, наприклад: замки, семафори, засувки, атомні об'єкти, правила синхронізації тощо ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.