C ++: Как можно реализовать структуры данных без блокировки в C ++, если std :: atomic_flag - единственный атомарный тип без блокировки? - PullRequest
0 голосов
/ 12 июня 2018

Типичным способом реализации структур данных без блокировки является использование атомарных операций 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 является единственным атомарным типом без блокировки для некоторого компилятора?

1 Ответ

0 голосов
/ 12 июня 2018

Единственной вероятной причиной того, что компилятор не имеет реализации без блокировки атомарного типа, является отсутствие у процессора атомарных операций.Я не знаю ни о каком современном процессоре, где это происходит.

Если процессор не поддерживает атомарные операции, у вас, вероятно, нет другого выбора, кроме как использовать мьютексы, семафоры или аналогичные примитивы синхронизации

...