Типичным способом реализации структур данных без блокировки является использование атомарных операций CAS, таких как std::compare_exchange_strong
или std::compare_exchange_weak
.Пример использования этого метода можно увидеть в Энтони Уильямсе «Параллелизм C ++ в действии», где реализован стек без блокировки.Стек реализован в виде связанного списка с указателем std::atomic<node*>
.Операции CAS выполняются с этим указателем во время нажатия и всплытия.Но стандарт C ++ гарантирует, что только std::atomic_flag
не блокируется, другие атомарные типы, включая std::atomic<T*>
, могут не быть свободными от блокировки.
1) правильно ли я понимаю, что если std::atomic<T*>
не без блокировки (std::atomic::is_lock_free()
возвращает false), то структура данных, основанная на операциях CAS на std::atomic<T*>
, не без блокировки?
2) Если да, то каковы альтернативные способы реализации структур данных без блокировки на C ++, если std::atomic_flag
является единственным атомарным типом без блокировки для некоторого компилятора?