Concurrency and parallelism
CP.100
Не используйте программирование без блокировок, если у вас нет абсолютной необходимости
Причина
Это подвержено ошибкам и требует уровня экспертных знаний о функциях языка, архитектуре машины и структурах данных.
Пример, плохо
extern atomic<Link*> head; // общее начало связного списка
Link* nh = new Link(data, nullptr); // подготовить ссылку для вставки
Link* h = head.load(); // прочитать общее начало списка
do {
if (h->data <= data) break; // если так, вставить в другое место
nh->next = h; // следующий элемент — это предыдущее начало
} while (!head.compare_exchange_weak(h, nh)); // написать nh в head или в h
Найдите ошибку. Было бы действительно сложно найти через тестирование. Прочитайте о проблеме ABA.
Исключение
Atomic переменные могут использоваться просто и безопасно, пока вы используете последовательно согласованную модель памяти (memory_order_seq_cst), которая является стандартной.
Примечание
Механизмы параллелизма более высокого уровня, такие как threads и mutexes, реализуются с использованием программирования без блокировок.
Альтернатива: Используйте структуры данных без блокировок, реализованные другими как часть некоторой библиотеки.