在另一个线程中读取变量

4 multithreading atomic c++11 stdatomic

我正在使用linux,我有两个在另一个线程中读/写的变量.偶尔(100ms),ThreadB读取变量的状态并执行某些操作.它基本上是一个while(1){ dosomething(); usleep(); }.我担心变量会被缓存而且永远不会更新.

什么是确保循环在优化后才能工作的最佳方法?我在想volatile应该做的工作,但我听说它有时不起作用.两个循环都不经常运行(10ms +).访问它们的最简单直接的方法是什么?我正在使用C++ 11

我有点不确定如何使用std::atomic<int>.我可以像普通的int变量一样使用它,它会按预期工作吗?

Phi*_*ler 5

您确实可以将其声明为std::atomic<int>,并且事情应该按照您的意愿工作.

volatile是关于保留生成的代码必须呈现给处理器以进行读/写的地址和值的序列.它完全没有限制硬件用于内存一致性的目的,这是关注的问题atomic.以下是英特尔发表的一篇解释这种差异的文章.

C和C++标准(从2011年开始)定义了一个内存模型,该模型描述了根据语言定义或未定义的操作,以及如果整个程序定义明确,表达式可以生成什么值.

根据标准,任何由多个线程对单个对象(例如您的共享int)进行非同步访问的程序(其中至少一次访问是写入)是未定义的.声明变量volatile不会使对它的访问同步.atomic根据定义,对声明为变量的变量的访问始终是同步的.

在默认情况下,如果您只是使用atomic<int>而不更改有关如何使用它的任何其他内容,您将获得所谓的顺序一致访问,这是线程之间最强协调的,因此可能是最昂贵的.对于您的用例,这似乎不是一个问题 - 成本是纳秒到微秒的数量级,而您在几毫秒内轮询.如果确实需要进一步优化,则可能会指定限制较少的访问.