在另一个线程中读取变量

用户34537

我正在使用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进行非同步访问的程序(其中至少一次访问是写操作)声明变量不会使对其的访问同步。根据定义,对声明为的变量的访问始终是同步的。volatileatomic

在默认情况下,如果只使用atomic<int>而不改变使用方式,您将获得所谓的顺序一致访问,这是线程之间协调最紧密的,因此可能是最昂贵的。对于您的用例来说,这似乎并不在意-花费在几毫秒到几微秒的数量级,而您以毫秒为单位进行轮询。如果确实需要进一步优化,则可以指定限制较少的访问。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在一个线程中修改成员变量并在另一个线程中读取

在另一个线程中运行的方法中未读取服务变量

从C ++中的另一个线程读取指针

通过另一个线程读取变量-变量不会改变

如何在一个线程中修改变量并在另一个线程中检查变量?

从另一个线程调用setter时读取实例变量是否安全?

如何从C#中的另一个线程在主线程中设置变量?

JPA:在一个事务中读取并保留,而在另一个线程中阻止读取

如何从阻止读取Gtk3中的另一个线程中检索数据?

Android:要求从一个线程访问的变量必须立即在另一个线程中可用

从另一个线程读取期间是否可以读取非易失性变量的陈旧值?

从C ++代码中的另一个线程读取的性能影响

从另一个线程访问一个线程上的变量-Android

将变量从一个线程输出到另一个线程

如何从另一个函数读取变量?

Python:如何从另一个进程读取变量?

从另一个 javascript 文件读取/使用变量

Python多线程使用另一个线程中的一个线程的数据

由该类的方法延迟分配的非易失性变量不能被另一个线程读取吗?

如何从React中的另一个组件读取变量?

在函数内部的另一个 if 条件中读取变量的值

如何使用ajax或jquery或javascript读取另一个文件中的PHP变量

从另一个线程中的“ panic!”中恢复

在另一个类中调用一个通过IBaction读取动态变量的函数

C ++:如何在一个线程中读取二进制文件并将其写入另一个线程中?

如何使用共享内存在一个线程中修改值并在另一个线程中读取值?

OpenGL在另一个线程中绘图

在GUI中显示另一个线程的状态

与另一个线程中的循环通信