З дискусії, яку я бачив, схоже, що атомна робота та безпека ниток - це одне і те ж, але багато людей кажуть, що вони різні. Хтось може сказати мені різницю, якщо така є?
З дискусії, яку я бачив, схоже, що атомна робота та безпека ниток - це одне і те ж, але багато людей кажуть, що вони різні. Хтось може сказати мені різницю, якщо така є?
Відповіді:
Атомні операції - це спосіб досягти безпеки ниток або за допомогою використання якихось замків, таких як Mutexes або Semaphores, які використовують атомні операції всередині, або впроваджуючи синхронізацію без блокування, використовуючи огорожі атоми та пам'яті.
Таким чином, атомні операції над примітивними типами даних є інструментом для досягнення безпеки потоку, але не забезпечують безпеку потоку автоматично, оскільки у вас зазвичай кілька операцій, які залежать один від одного. Ви повинні гарантувати, що ці операції виконуються без перерви, наприклад, використовуючи Mutexes.
Так, запис одного з цих типів атомних даних у c # є безпечним для потоків, але це не робить функцію, яку ви використовуєте в потоці, безпечною. Це лише забезпечує правильне виконання одного запису, навіть якщо другий потік отримує доступ до нього "одночасно". Не зважаючи на те, наступне зчитування з поточного потоку не забезпечується для отримання значення, записаного раніше, оскільки інший потік, можливо, записав до нього, лише те, що прочитане значення є дійсним.
Атомність і безпека ниток - це дві різні речі. Атомність стосується якості операції "все або нічого"; якщо операція не може бути виконана на 100% успішно, система повинна залишатися в загальному стані, в якому вона була до початку будь-якої частини операції. Класичний приклад - транзакція з базою даних; Під час збереження рахунку-фактури, включаючи його заголовок та декілька позицій, кожну окрему частину кожного ряду баз даних необхідно успішно ввести; якщо ні, дані втрачаються або пошкоджуються. Якщо позицію неможливо вставити, то не тільки не повинні бути вставлені інші рядки, але жоден з уже оброблених рядків не повинен залишатися.
Під безпекою нитки розуміється поєднання речей, включаючи атомність, що дозволяє операції бути "відпочинкової"; кілька робітників можуть виконувати одну і ту ж операцію, починаючи в той самий або різний час, без впливу на будь-яку іншу. Існує багато моделей для безпечної роботи з нитками; більшість з них зводиться концептуально до виконання декількох паралельних завдань у повній ізоляції (два працівники можуть виконувати одне і те ж завдання на двох різних об'єктах або колекції предметів, не знаючи, коли інший працівник навіть існує), або встановлюючи "трубопровід", в рамках якого декілька робітників виконують одне завдання за всю операцію (або кожен працівник просувається від першого завдання до наступного тощо), або зосереджується на одному завданні і передає наступному працівникові свій проміжний «робочий продукт»).
Атомна операція - це операція, яку неможливо перервати.
Безпечна нитка - це нитка, яку можна безпечно перервати.
Безпека різьби досягається при атомних операціях, зокрема в логіці, яка запобігає багатократному доступу до критичних ресурсів.
Основна атомна операція - Test-and-set , яка використовується для реалізації семафорів, які, в свою чергу, використовуються для забезпечення безпеки потоку.
Безпека ниток - це скоріше рамка або "концепція", атомна операція - це підмножина, засіб (один із багатьох) для досягнення статусу як класифікованого "безпечно для потоків".
Безпека нитки відноситься до процесу, до якого можна отримати доступ окремими потоками, де доступ до однієї (та маніпулювання даними) не може пошкодити цілісність роботи іншого.
Значна частина майстерності програміста - це знати, як цього досягти, залежно від ситуації та ключової мети, можливо, вам доведеться реалізувати, наприклад: замки, семафори, засувки, атомні об'єкти, правила синхронізації тощо ...