gpt4 book ai didi

c++ - 内联替换会导致多线程代码中的无限循环吗?

转载 作者:行者123 更新时间:2023-12-03 20:00:26 24 4
gpt4 key购买 nike

请注意:这只是出于好奇而提出的问题,而不是关于编写更好的多线程代码。
当然,我不会也不会在实际项目中编写这样的代码。inline 时可能发生内联替换。添加了关键字。
所以我很好奇。
假设我们有这样的代码:

static bool done = false;

inline void setDone(bool newState) {
done = newState;
}

inline bool getDone() {
return done;
}

void someWorkerThreadJob() {
// Accessing without any lock/atomic/volatile
while (getDone() == false) {
}
}
可以 someWorkerThreadJob()像下面这样编译并进入无限循环?
void someThreadJob() {
while (done == false) {
}
}
这也将我引向下一个问题。
呢? setter/getter 二传手上课吗?
在类中定义的成员函数是隐式的 inline ,所以我认为可能会发生内联替换,因此同样的问题。
它是否正确?

最佳答案

访问done必须是 protected 并行和同步 线程之间。否则,处理器或编译器会产生/执行不正确的指令序列。您当前的程序格式不正确。
您面临的问题是 done可以缓存在 L1 CPU 缓存中(取决于处理器),或者编译器可以优化对 done 的访问。全局变量(通常通过将其放入寄存器中,尽管许多编译器实际上并没有这样做)。
您需要使用 原子指令互斥体/锁 (或任何同步机制)以便 done修改后可以被其他线程看到。使用原子指令,编译器会生成适当的内存栅栏,不要放置 done在寄存器中或/并产生同步通信总线的指令(例如在 x86_64 上)。
有关更多信息,您可以查看缓存一致性协议(protocol),如 MOESI看看how x86 deals with atomics instruction .
在这种情况下,主流编译器(如 GCC 和 Clang)实际上是 optimize the code to no-op instruction (这里关于 C++ 标准是完全合法的)主要是由于 staticinline帮助编译器的关键字。 std::atomic 的情况并非如此。 .

关于c++ - 内联替换会导致多线程代码中的无限循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67431083/

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