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

C++: How can lock-free data structures be implemented in C++ if std::atomic_flag is the only lock-free atomic type?

本文关键字:C++ 数据结构 实现 类型 flag 唯一 如果 std atomic      更新时间:2023-10-16

实现无锁数据结构的典型方法是使用原子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++上实现无锁数据结构的替代方法是什么?

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

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