【问题标题】:C++: How can lock-free data structures be implemented in C++ if std::atomic_flag is the only lock-free atomic type?C++:如果 std::atomic_flag 是唯一的无锁原子类型,如何在 C++ 中实现无锁数据结构?
【发布时间】:2018-06-12 20:13:00
【问题描述】:

实现无锁数据结构的典型方法是使用原子 CAS 操作,例如 std::compare_exchange_strongstd::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


【解决方案1】:

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

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

【讨论】:

  • 好吧,严格来说,编译器确实有一个无锁实现:std::atomic_flag。问题是如果它是 only 无锁实现怎么办。或者您的意思是所有现代处理器都可能对适合单个单词的数据进行原子操作(例如void*)?
  • 我不是 cpu 指令可用性方面的专家,但如果任何支持多线程的 cpu 没有单词所需的原子操作,我会感到非常惊讶
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 2015-07-27
  • 2023-03-24
  • 2013-12-03
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多