【发布时间】:2018-06-12 20:13:00
【问题描述】:
实现无锁数据结构的典型方法是使用原子 CAS 操作,例如 std::compare_exchange_strong 或 std::compare_exchange_weak。在 Antony Williams 的“C++ Concurrency in Action”中可以看到该技术的使用示例,其中实现了无锁堆栈。堆栈实现为带有std::atomic<node*> 头指针的链表。在 push 和 pop 期间,对此指针执行 CAS 操作。但是 C++ 标准保证只有std::atomic_flag 是无锁的,其他原子类型,包括std::atomic<T*>,可能不是无锁的。
1) 我是否正确理解如果std::atomic<T*> 不是无锁的(std::atomic::is_lock_free() 返回false),那么基于std::atomic<T*> 上的CAS 操作的数据结构不是无锁的?
2) 如果是,那么如果 std::atomic_flag 是某些编译器唯一的无锁原子类型,那么在 C++ 上实现无锁数据结构的替代方法是什么?
【问题讨论】:
-
如果某些操作不是无锁的,在现实生活中对你来说是不是一个大问题?您是否对您的应用程序进行了基准测试并确定“非无锁”导致了实际的性能问题?如果没有,你为什么在乎?
-
@JesperJuhl 这个问题只是出于好奇,目前我不知道非无锁
std::atomic<void*>类型的平台。
标签: c++ multithreading c++11 atomic lock-free