代码之家  ›  专栏  ›  技术社区  ›  Maarten Bamelis

使用松弛原子布尔同步两个线程[重复]

  •  3
  • Maarten Bamelis  · 技术社区  · 6 年前

    一些同事和我正在讨论用于同步两个线程的放松原子布尔值。我们已经做了一些在线研究,并发现了其他涉及放松原子的样本和片段,但是我们没有从那些适用于我们的例子中得出任何结论。

    std::atomic_bool stopping{false};
    

    第一个线程进入一个循环,只有在设置了原子布尔时才退出。注意,每个循环迭代上的负载都标记为“松弛”。

    // 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 回复  |  直到 6 年前
        1
  •  2
  •   Oliv    6 年前

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

    实现应该确保原子或同步操作分配的最后一个值(按修改顺序)在有限的时间内对所有其他线程可见。

    N、 B.:如果是线程2,后者存储 false 在原子中,线程1可能永远看不到状态 true

    N、 B.2:我刚刚谈到你的问题的题目 使用松弛原子同步线程