如何在 std::atomic 上实现一个简单的自旋锁<T>,以便编译器不会对其进行优化?

How do I implement a simple spinlock on std::atomic<T> so that the compiler doesn't optimize it out?

本文关键字:lt 编译器 gt 优化 实现 atomic std 简单 一个      更新时间:2023-10-16

我一直在尝试非常简单的方法,仅使用标准C++11/14锁定线程,目前我最终使用了如下所示的东西

std::atomic<bool> setup_ready(false);
{
  // thread 1
  while (!setup_ready.load()) std::this_thread::yield();
  // do something
}
{
  // thread 2
  // perform some setup
  setup_ready.store(true);
}

是否有某些东西阻止编译器优化this_thread::yield()调用,进而优化整个循环?

如果我完全删除了产量,只想像这样忙着等待怎么办?有没有一种跨平台的方法可以防止编译器优化循环?还是标准在原子上循环时阻止它?

{
  // thread 1
  while (!setup_ready.load()) ;
  // do something
}

我想出的唯一解决方案是在组合中添加一个易失性变量,但我不确定这是否是最好的方法。我也尝试检查有关原子学的标准,但我找不到有关编译器优化细节的许多细节。

编译器不允许优化

this_thread::yield(),除非它可以确定它没有副作用 - 它不能,因为它不是。

原子加载操作无法优化,因为它包括内存屏障,并且专门定义为拾取其他线程所做的修改。