18得票4回答
使用std::atomic来发出线程已完成执行的信号是必要的吗?

我想检查一个std::thread是否已经执行完毕。在 Stackoverflow 上搜索后,我发现了以下问题,它解决了这个问题。被接受的答案建议工作线程在退出之前设置一个变量,并让主线程检查这个变量。以下是这种解决方案的最小工作示例:#include <unistd.h> #in...

18得票1回答
为什么在C++14和C++17中,std::atomic构造函数的行为不同?

我正在使用C++11开展一个项目,尝试了以下代码:#include <atomic> struct A { std::atomic_int idx = 1; }; int main() { return 0; } 我得到了编译器错误error: use of ...

17得票2回答
比较并交换 C++0x

来自于关于C++原子类型和操作的C++0x提案: 29.1 顺序和一致性 [atomics.order] 添加一个新的子条款,包含以下段落。 枚举类型 memory_order 指定了详细的常规(非原子)内存同步顺序,如 [由N2334添加的新章节或其采纳后的后继] 中所定义,并可能提供操...

17得票1回答
如何优雅地将std::atomic数组进行零初始化?

假设我有一个类,其中包含一个成员数组std::atomic,该数组的大小通过计算确定(即它可能根据程序中其他常量的变化而改变)。 class Foo { static constexpr size_t kArraySize = ComputeArraySize(); std::ato...

17得票1回答
显式原子加载/存储与通常的 operator= 和 operator T 有什么区别?

Consider these two variants:std::atomic<int> a; a = 1; int b = a; 和std::atomic<int> a; a.store(1); int b = a.load(); 我从文档中了解到第二个是完全原子性的...

16得票2回答
在x86架构中,如何使用MOV实现release-and-acquire(释放-获取)?

这个问题是对以下内容的跟进/澄清: MOV x86指令是否实现了C++11的memory_order_release原子存储? 这表明MOV汇编指令足以在x86上执行acquire-release语义。我们不需要LOCK、栅栏或xchg等。然而,我很难理解这是如何工作的。 英特尔文档Vo...

16得票3回答
不同线程中对同一位置进行两次松散写入,其顺序是否总是被其他线程以相同的顺序观察到?

在x86架构中,对同一个内存位置的存储具有总顺序,例如参见这个视频。那么在C++11内存模型中保证了什么? 更精确地说,在 -- Initially -- std::atomic<int> x{0}; -- Thread 1 -- x.store(1, std::memory...

16得票6回答
C++标准:弱化原子存储是否可以在互斥锁之上提升?

标准中是否有任何措辞保证松弛存储不会被提升到互斥锁的锁定之上?如果没有,是否有任何措辞明确表示编译器或CPU这样做是可以接受的? 例如,考虑以下程序(可能使用acq/rel来处理foo_has_been_set并避免锁定,并且/或使foo本身成为原子性。它以此方式编写是为了说明这个问题)。s...

16得票4回答
如何在C++11中实现一个StoreLoad屏障?

我想编写可移植的代码(适用于Intel、ARM、PowerPC等平台),解决一个经典问题的变体:Initially: X=Y=0 Thread A: X=1 if(!Y){ do something } Thread B: Y=1 if(!X){ do something }...

15得票4回答
不同线程中对不同位置进行的两次原子写操作是否总是按相同顺序被其他线程看到?

与我之前的问题类似,请考虑这段代码 -- Initially -- std::atomic<int> x{0}; std::atomic<int> y{0}; -- Thread 1 -- x.store(1, std::memory_order_release)...