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

时间:2016-04-13 16:07:09

标签: c++ multithreading mutex atomic

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

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

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

2 个答案:

答案 0 :(得分:6)

如果我理解正确,每隔一个线程正在读取电压,将其写入某个“数据结构”,其他线程偶尔从该数据结构中读取(我是否正确?)

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

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

所以你需要通过原子来锁定原子和同步的“数据结构”。

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

答案 1 :(得分:2)

是的,您需要数据是原子的,以消除数据竞争的可能性。在极端性能要求的情况下,您可能在读取或写入变量时使用宽松的内存排序 - 这将确保原子性,但不会添加排序(如果架构不是自然排序的,如英特尔)