我正在使用linux,并且我有两个在另一个线程中读取/写入的变量。偶尔(100毫秒)ThreadB读取变量的状态并执行某些操作。基本上是while(1){ dosomething(); usleep(); }
。我担心变量将被缓存并且永远不会更新。
确保循环在优化后正常工作的最佳方法是什么?我在想volatile
应该做这份工作,但我听说有时不起作用。这两个循环都不经常运行(10毫秒以上)。访问它们的最简单直接的方法是什么?我正在使用C ++ 11
我有点不确定如何使用std::atomic<int>
。我可以像普通的int变量一样使用它,并且可以按预期工作吗?
实际上,您可以仅将其声明为std::atomic<int>
,然后一切都将按需要运行。
volatile
关于保留地址和值的顺序,这些地址和值必须将生成的代码提供给处理器以进行读取/写入。为了保持存储器的一致性,它完全不限制硬件用它做什么atomic
。这是英特尔的一篇文章,解释了这种差异。
C和C ++标准(从2011年开始)定义了一个内存模型,该内存模型描述了根据语言定义的操作或不定义的操作,以及如果整个程序定义良好,表达式可以产生的值。
根据标准,未定义通过多个线程对单个对象(例如,您的shared int
)进行非同步访问的程序(其中至少一次访问是写操作)。声明变量不会使对其的访问同步。根据定义,对声明为的变量的访问始终是同步的。volatile
atomic
在默认情况下,如果只使用atomic<int>
而不改变使用方式,您将获得所谓的顺序一致访问,这是线程之间协调最紧密的,因此可能是最昂贵的。对于您的用例来说,这似乎并不在意-花费在几毫秒到几微秒的数量级,而您以毫秒为单位进行轮询。如果确实需要进一步优化,则可以指定限制较少的访问。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句