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