c++ - 我是否需要保护一个由一个线程写入并由多个线程读取的变量?

标签 c++ multithreading mutex atomic

我正在编写一个数据采集系统。该系统既处理来 self 们的信号数字化仪的快速数据,又慢速控制/监控探测器的高压系统等。慢速控制系统每秒读取一次电压并将其写入数据结构。

每个事件在写入磁盘之前都标有其检测器的电压。为此,事件处理线程读取由慢速控制/监视线程编写的结构。

鉴于在电压读取后 X 微秒发生的事件是否被标记为前一秒的电压读取并不重要:我是否需要使用互斥锁来保护数据结构或原子变量结构?

最佳答案

如果我理解正确,每一秒都有一个线程读取电压,将其写入某个“数据结构”,其他线程时不时地从该数据结构中读取(我是否正确?)

如果此“数据结构”具有原子加载和存储(例如,intchar 等,在 x86 上),则该值可能是其他正在读取的线程永远不会改变(或者可能会发生其他令人讨厌的事情,比如重新排序)。您需要同步以确保从其内存存储而不是缓存存储正确读取/写入原子存储/加载。

如果这个“数据结构”不是原子的——那么我们正在处理未定义的行为,而这总是错误的。

所以你确实需要使“数据结构”既是原子的又是同步的,要么通过原子,要么通过锁。

如果这个“数据结构”足够小,std::atomic 似乎适合这里。如果没有,看看你的系统是否支持读写锁,它们似乎非常适合这里。

关于c++ - 我是否需要保护一个由一个线程写入并由多个线程读取的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36603950/

相关文章:

c++ - 通过 copy-and-swap 分配与两个锁

c++ - pthread_mutex_t 作为类成员导致死锁

c++ - 我可以向编译器查询 C++0x "alignas"支持吗?

C++理解拷贝构造函数

c++ - 一旦找到所需的替代方案,就跳出 std::visit

c++ - 奇怪的错误:在没有真正创建指针时使用已删除的函数 'std::unique_ptr<_Tp, _Dp>::unique_ptr

c# - 强制 ThreadPool 更快地启动线程

java - 当线程进入 Java 中的同步块(synchronized block)/方法时到底发生了什么

java - 如果 EDT 是一个单独的线程,为什么在这个例子中 invokeLater 等待主线程完成?

c++ - 互斥锁是否正常工作?不能死锁