我使用的是Linux,我有两个在另一个线程中读/写的变量。偶尔(100ms),ThreadB读取变量的状态并执行某些操作。它基本上是while(1){ dosomething(); usleep(); }
。我担心变量会被缓存而且永远不会更新。
确保优化后循环可行的最佳方法是什么?我在想volatile
应该做的工作,但我听说它有时不起作用。两个循环都不经常运行(10ms +)。访问它们的最简单直接的方法是什么?我正在使用C ++ 11
我有点不确定如何使用std::atomic<int>
。我可以像普通的int变量一样使用它,它会按预期工作吗?
答案 0 :(得分:5)
您确实可以将其声明为std::atomic<int>
,并且事情应该按照您的意愿运作。
volatile
是关于保留生成的代码必须呈现给处理器以进行读/写的地址和值的序列。出于内存一致性的目的,它根本不会限制硬件的功能,这是atomic
的关注点。这是解释这种差异的article from Intel。
C和C ++标准(从2011年开始)定义了一个内存模型,它描述了根据语言定义或未定义的操作,以及如果程序为整体定义明确。
根据标准,任何程序通过多个线程对单个对象(例如,您的共享int
)进行非同步访问,其中至少一次访问是写入,未定义 。声明变量volatile
不会使对它的访问同步。根据定义,对声明为atomic
的变量的访问始终是同步的。
在默认情况下,如果您只使用atomic<int>
而不更改有关如何使用它的任何其他内容,您将获得所谓的顺序一致访问,这是最多的线程之间强烈协调,因此可能成本最高。对于您的用例,这似乎不是一个问题 - 成本是纳秒到微秒的数量级,而您在几毫秒内轮询。如果您确实需要进一步优化,则可能会指定限制较少的访问。