gpt4 book ai didi

c++ - 什么时候会通过优化删除变量?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:51 24 4
gpt4 key购买 nike

我正在使用线程,我对如何允许编译器优化以下代码有疑问:

void MyClass::f(){
Parent* p = this->m_parent;
this->m_done = true;
p->function();
}

使用 p (在堆栈或寄存器中)而不是 this->m_parent 来调用函数非常重要。因为一旦 m_done 变成 true 然后 this 可能会从另一个线程中删除,如果它恰好运行它的清理 channel (我因此发生了实际崩溃),在这种情况下 m_parent 可能包含垃圾,但线程堆栈/寄存器将是完好无损。

我在 GCC/Linux 上的初步测试表明我没有竞争条件,但我想知道其他编译器是否也会出现这种情况?

这是 gulp volatile 的情况吗?我看过 What kinds of optimizations does 'volatile' prevent in C++?Is 'volatile' needed in this multi-threaded C++ code?,但我觉得它们都不适用于我的问题。

我对依赖它感到不安,因为我不确定编译器在这里可以做什么。我看到以下情况:

  • 无/有益优化,this->m_parent 中的指针存储在堆栈/寄存器中,此值稍后用于调用 function(),这是需要的行为。
  • 编译器删除了 p,但 this->m_parent 偶然在寄存器中已经可用,编译器使用它来调用 function() 可以工作,但在编译器之间不可靠。这很糟糕,因为它可能会暴露移动到不同平台/编译器版本的错误。
  • 编译器删除 p 并在调用 this->m_parent 之前读取 function() ,这会产生我无法拥有的竞争条件。

有人可以阐明编译器在这里可以做什么吗?

编辑

我忘了说 this->m_done 是一个 std::atomic<bool> 而我使用的是 C++11。

最佳答案

如果 m_done,此代码将像用 C++11 编写的那样完美运行是std::atomic<bool> . m_parent 的读取是 sequenced-before 写入 m_done这将与 m_done 的假设读取同步在另一个线程中,先于 假设写入m_parent .综合起来,这意味着该标准保证该线程读取 m_parent发生在另一个线程的写入之前。

关于c++ - 什么时候会通过优化删除变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17619227/

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