繁体   English   中英

我需要std :: atomic吗? <bool> 还是POD bool足够好?

[英]Do I need std::atomic<bool> or is POD bool good enough?

考虑以下代码:

// global
std::atomic<bool> run = true;

// thread 1
while (run) { /* do stuff */ }

// thread 2
/* do stuff until it's time to shut down */
run = false;

我是否需要与原子变量相关的开销? 我的直觉是,布尔变量的读/写无论如何都或多或少是原子的(这是常见的g ++ / Linux / Intel设置)并且如果有一些写/读时序怪异,并且我在线程1上的运行循环停止一个结果提前或结束,我对这个应用程序并不十分担心。

或者我在这里缺少一些其他考虑因素? 看看perf,看来我的代码花了相当多的时间在std::atomic_bool::operator bool ,我宁愿把它放在循环中。

您需要使用std::atomic来避免不希望的优化(编译器一次读取值并始终循环或从不循环)并在没有强排序内存模型的系统上获得正确的行为(x86是强有序的,因此一旦写完成,下一次读取会看到它;在其他系统上,如果线程由于其他原因没有将CPU缓存刷新到主RAM,那么很长时间内可能看不到写入,如果有的话)。

您可以改善性能。 std::atomic默认使用使用对单个标志值过度杀伤的顺序一致性模型 您可以通过使用加速它load / store有一个明确的(以及不太严格的)的存储排序,所以每个load使用的最偏执的模式,以保持一致性是不需要的。

例如,您可以这样做:

// global
std::atomic<bool> run = true;

// thread 1
while (run.load(std::memory_order_acquire)) { /* do stuff */ }

// thread 2
/* do stuff until it's time to shut down */
run.store(false, std::memory_order_release);

在x86机器上,任何比(默认的,最严格的)顺序一致性排序更严格的排序通常最终什么都不做,只是确保指令按特定顺序执行; 由于强有序的存储器模型,不需要总线锁定等。 因此,除了保证值实际上是从内存中读取,而不是缓存到寄存器并重用,在x86上使用原子这种方式是免费的,而在非x86机器上,它使你的代码正确(否则它不会是)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM