C++:如果 std::atomic_flag 是唯一的无锁原子类型,如何在 C++ 中实现无锁数据结构?

und*_*ind 3 c++ multithreading atomic lock-free c++11

实现无锁数据结构的典型方法是使用原子 CAS 操作,例如std::compare_exchange_strongstd::compare_exchange_weak。这种技术的使用示例可以在 Antony Williams 的“C++ Concurrency in Action”中看到,其中实现了无锁堆栈。堆栈被实现为带有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)如果是,那么,如果std::atomic_flag是某些编译器的唯一无锁原子类型,那么在 C++ 上实现无锁数据结构的替代方法是什么?

Ala*_*les 5

编译器没有原子类型的无锁实现的唯一可能原因是处理器没有原子操作。我不知道现代处理器是这​​种情况。

如果处理器不支持原子操作,您可能别无选择,只能使用互斥锁、信号量或类似的同步原语

  • 我不是 CPU 指令可用性方面的专家,但如果任何能够进行多线程处理的 CPU 没有必要的单词原子操作,我会感到非常惊讶 (2认同)