在可能的同时从单独的线程中读取全局变量是危险的吗?

ch0*_*1n3 5 c++ boost-thread

所以我正在编写这个整洁的小程序来自学线程,我正在使用boost :: thread和C++这样做.

我需要主线程与工作线程进行通信,为此我一直在使用全局变量.它按预期工作,但我不禁感到有点不安.

如果工作线程在主线程正在读取值的同时尝试写入全局变量,该怎么办?这是不好的,危险的,或希望在幕后考虑?

T.C*_*.C. 9

§1.10[intro.multithread](引用N4140):

6 如果其中一个修改了内存位置(1.7)而另一个访问或修改了相同的内存位置,则两个表达式评估会发生冲突.

23 如果,两个行动可能同时发生

  • 它们由不同的线程执行,或者
  • 它们没有排序,至少有一个是由信号处理程序执行的.

程序的执行包含数据竞争,如果它包含两个可能同时发生冲突的动作,其中至少有一个不是原子的,并且除了下面描述的信号处理程序的特殊情况之外,它们都不会发生在另一个之前.任何此类数据争用都会导致未定义的行为.

纯粹的并发读取不会发生冲突,因此是安全的.

如果至少有一个线程写入内存位置,而另一个线程从该位置读取,则它们会发生冲突并可能并发.结果是数据争用,因此是未定义的行为,除非使用适当的同步,通过对所有读取和写入使用原子操作,或者通过使用同步原语在读取和写入之间的关系之前建立发生.