我是否需要保护一个由一个线程写入并由多个线程读取的变量?
Do I need to guard a variable that is written by one thread and read by many?
我正在写一个数据采集系统。该系统既处理来自我们的信号数字化仪的快速数据,又处理诸如检测器高压系统之类的慢速 controls/monitoring。慢速控制系统每秒读取一次电压并将其写入数据结构。
每个事件在写入磁盘之前都标有其检测器的电压。为此,事件处理线程读取由慢速控制/监视线程编写的结构。
鉴于在电压读取后 X 微秒发生的事件是否被标记为前一秒的电压读取并不重要:我是否需要使用互斥锁来保护数据结构或结构中的原子变量?
是的,您需要数据是原子的以消除数据竞争的可能性。在极端性能要求的情况下,您可以在读取或写入变量时使用宽松的内存排序 - 这将确保原子性,但不会添加排序(如果体系结构不是自然排序的,如 Intel)
如果我理解正确,每一秒都有一个线程在读取电压,将其写入某些 "data structure" 并且其他线程时不时地从该数据结构中读取(我是对的吗?)
如果此 "data structure" 具有原子加载和存储(例如,在 x86 上 int
、char
等),那么其他线程的值可能是阅读永远不会改变(或者可能会发生其他令人讨厌的事情,比如重新排序)。您需要同步以确保原子 store/load 从其内存存储而不是缓存存储中正确 read/written。
如果这个 "data structure" 不是原子的 - 那么我们正在处理未定义的行为,这总是错误的。
所以你确实需要使"data structure"既是原子的又是同步的,要么通过原子,要么通过锁。
如果这个"data structure"足够小,std::atomic
似乎适合这里。如果没有,请查看您的系统是否支持 reader-writer 锁,它们似乎非常适合这里。
我正在写一个数据采集系统。该系统既处理来自我们的信号数字化仪的快速数据,又处理诸如检测器高压系统之类的慢速 controls/monitoring。慢速控制系统每秒读取一次电压并将其写入数据结构。
每个事件在写入磁盘之前都标有其检测器的电压。为此,事件处理线程读取由慢速控制/监视线程编写的结构。
鉴于在电压读取后 X 微秒发生的事件是否被标记为前一秒的电压读取并不重要:我是否需要使用互斥锁来保护数据结构或结构中的原子变量?
是的,您需要数据是原子的以消除数据竞争的可能性。在极端性能要求的情况下,您可以在读取或写入变量时使用宽松的内存排序 - 这将确保原子性,但不会添加排序(如果体系结构不是自然排序的,如 Intel)
如果我理解正确,每一秒都有一个线程在读取电压,将其写入某些 "data structure" 并且其他线程时不时地从该数据结构中读取(我是对的吗?)
如果此 "data structure" 具有原子加载和存储(例如,在 x86 上 int
、char
等),那么其他线程的值可能是阅读永远不会改变(或者可能会发生其他令人讨厌的事情,比如重新排序)。您需要同步以确保原子 store/load 从其内存存储而不是缓存存储中正确 read/written。
如果这个 "data structure" 不是原子的 - 那么我们正在处理未定义的行为,这总是错误的。
所以你确实需要使"data structure"既是原子的又是同步的,要么通过原子,要么通过锁。
如果这个"data structure"足够小,std::atomic
似乎适合这里。如果没有,请查看您的系统是否支持 reader-writer 锁,它们似乎非常适合这里。