代码和宽松原子的编译器/硬件优化

问题描述

我一直在听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);
}

具体来说,在线程函数中,允许将计数移动到函数中的任何位置。在这种情况下,请澄清我的假设是否正确-

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)