1

我一直在听 Herb Sutter 的 Atomic Weapons 演讲,有一张幻灯片,他讨论了已发布的原子变量和代码优化。我的问题更多地与允许编译器优化做什么以及不允许做什么有关。Memory_order_relaxed 就是这种魔法,它允许原子操作在它们所使用的函数内部浮动。

考虑以下代码片段(count 是一个原子变量)(假设 count 的所有用法都已显示)-

//threaded function
// function start
...
while(...)
{
    ...
    if(...)
         ++count.fetch_add(1,memory_order_relaxed);
    ...
}
...
// function end
//main thread
int main()
{
   launch_threads();

   join_threads()
   cout<<count.load(memory_order_relaxed);
}

具体来说,在线程函数中,count 可以在函数中的任意位置移动。在这种情况下,请澄清我的假设是否正确-

  1. 从逻辑上讲,这意味着 if(...) 也应该随之移动,因此条件可以放在 while(...) 内的任何位置。
  2. 由于 while(...) 包含宽松变量,它应该能够在功能块内不受限制地上下移动。
  3. 可以将 count 变量移出 if(...)/while(...) 并用某种寄存器替换吗?

如果有任何链接可以帮助我更好地理解编译器优化的范围,请添加它们。

4

0 回答 0