c++ - 使用宽松的原子 bool 值来同步两个线程

标签 c++ multithreading atomic relaxed-atomics

<分区>

我和一些同事正在讨论用于同步两个线程的宽松原子 bool 值。我们进行了一些在线研究,发现了其他处理松弛原子的示例和片段,但我们未能从适用于我们的示例的那些中得出任何结论。

以下原子 bool 值在两个线程之间共享。

std::atomic_bool stopping{false};

第一个线程进入一个循环,只有在设置了原子 bool 值后才退出。请注意,每次循环迭代的负载都标记为松弛。

// Thread 1
while (!stopping.load(std::memory_order_relaxed))
{
    // ...
}

在第一个线程进入循环后的某个时刻(由其他一些同步机制保证),第二个线程执行以下语句。再次注意,这里的商店标记为放松。

// Thread 2
stopping.store(true, std::memory_order_relaxed);

问题:从纯理论的角度,第一个线程是否保证退出循环;为什么?


就我们认为理解松散原子而言,我们认为加载操作不能保证看到写操作的修改。但其他online examples concerning thread-safe counters让我们相信负载最终会接受修改...

最佳答案

线程1会在有限的时间后跳出循环,这是语言的要求[basic.exec]/18 :

An implementation should ensure that the last value (in modification order) assigned by an atomic or synchronization operation will become visible to all other threads in a finite period of time.

注意:如果线程 2,后者在原子中存储 false,线程 1 可能永远不会看到原子的状态 true

N.B.2:我刚刚落在你的问题的标题上using relaxed atomic to synchronize thread:那是不可能的。

关于c++ - 使用宽松的原子 bool 值来同步两个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53740862/

相关文章:

c++ - 为什么 std::atomic 的 compare_exchange 会引用期望值?

c++ - 签名EXE是否解决安全警告

c++ - 在 LLVM 中为变量使用特定的寄存器

c++ - Mutex 的锁定/解锁功能应该是 "const"吗?

c# - 多线程对象访问

rust - 如果通过原子操作进行门控,非原子写入是否可以安全读取?

c++ - 在 C++ 中访问原子变量的速度有多快

C++构造函数性能

c++ - 如何使用 operator>> 读取值但没有默认构造函数?

c++ - 在这 3 种从共享内存读取链表的方法中,为什么第三快?