Ite*_*tor 7 c++ multithreading atomic compiler-optimization c++11
如果我宣布一个原子变量,这是只有在一个线程中使用,是编译器能够优化了这一点,并更换std::atomic<T>有T在某些情况下?
我已经阅读了一些关于激励的编译器优化的文章,但它们主要是关于锁和存储的重新排序和分组,而不是关于消除它们.
我们std:shared_pointer举个例子.它有一个原子计数器,但如果只有一个线程可以访问它,它可以用一个简单的计数器代替,它仍然会表现得好像是一个原子.
答案取决于您对原子优化的假设。使用原子有两个效果:强制执行语句的可观察顺序并确保处理器缓存失效。
如果您使用的是英特尔处理器,则大多数后者都可以简单地删除。这是因为处理器保证相同的行为并且不需要进行特定处理。
然而对于订购,却有不同的故事。为了消除排序限制,您的编译器应该能够证明您没有不同的可观察行为。
实际上,如果您将指针或引用传递给不同编译单元中的函数,编译器将无法进行优化。另一方面,如果编译器对使用情况有完全的可见性,它可能会得出结论:不需要内存屏障,并据此消除它们。
解决代码生成的问题是很容易解决的问题,据我所知,大多数行业编译器至少对此有一些支持。消除另一端的内存障碍是正在进行的研究的一部分,因此这可能不可用,或者可能只涵盖非常简单的情况。
当你问这个问题时,认为你更了解你的用例可能听起来是合理的。但是,我建议当您需要原子行为时保留原子。手动优化非常耗时,而且好处可能并不明显。
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |