gpt4 book ai didi

c++ - 我在哪里设置内存屏障以便条件循环观察多线程值变化?

转载 作者:行者123 更新时间:2023-12-04 12:04:33 27 4
gpt4 key购买 nike

假设一个线程无限期运行,直到它的成员变量 stop 被设置。喜欢

while (!stop) {
// do something
}
我想防止它变成这个
if (!stop) {
while (true) {

}
}
那么我应该在哪里设置内存屏障/栅栏,以便无法执行此优化?
此外,这样的围栏是否已经足以确保更改为 true在下一次迭代中来自另一个线程是否可见?

最佳答案

So where would I set memory barriers / fences so that this optimization can't be performed?


A memory barrier/fence限制 memory ordering ,这可以防止编译器重新排序两个或多个内存访问 在同一线程中 .但是,内存排序不是这里的问题,因为您只是在谈论每个线程的单个内存访问。
相反,您正在谈论对同一变量 的两个内存操作来自两个不同的线程 .因此,这是 thread synchronization的问题,不是内存排序。
根据 §6.9.2.2 ¶21 of the ISO C++20 standard , 如果两个线程访问同一个变量而中间没有同步操作(例如互斥锁),并且如果这些内存访问不是
  • 两者都是原子的,或
  • 均为只读,

  • 那么这会导致未定义的行为。
    因此,在您的 while 的情况下环形
    while (!stop) {
    // do something
    }
    假设 stop是非原子数据类型,编译器允许假设变量 stop循环运行时永远不会被另一个线程修改(除非你碰巧在循环内部有一个同步操作),因为这样做会导致未定义的行为(这意味着编译器将被允许做任何事情)。
    出于这个原因,一个好的优化编译器会有效地将代码更改为以下内容:
    if (!stop) {
    while (true) {
    // do something
    }
    }
    但是,如果您更改变量 stop到原子数据类型,例如 std::atomic_flag std::atomic<bool> ,那么多个线程同时访问这个变量并不是未定义的行为。在这种情况下,编译器将不允许假设 stop不会被其他线程修改,从而不允许执行上述优化。

    关于c++ - 我在哪里设置内存屏障以便条件循环观察多线程值变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69031182/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com