问题描述
我一直在听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);
}
具体来说,在线程函数中,允许将计数移动到函数中的任何位置。在这种情况下,请澄清我的假设是否正确-
- 从逻辑上讲,这意味着if(...)也应随之移动,因此条件可以放在while(...)内的任何位置。
- 由于while(...)包含松弛变量,因此它应该能够不受限制地在功能块内上下移动。
- 是否可以将count变量移出if(...)/ while(...)并替换为某种寄存器?
如果有任何链接可以帮助我更好地了解编译器优化的范围,请添加它们。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)