所以我正在编写这个整洁的小程序来自学线程,我正在使用boost :: thread和C++这样做.
我需要主线程与工作线程进行通信,为此我一直在使用全局变量.它按预期工作,但我不禁感到有点不安.
如果工作线程在主线程正在读取值的同时尝试写入全局变量,该怎么办?这是不好的,危险的,或希望在幕后考虑?
§1.10[intro.multithread](引用N4140):
6 如果其中一个修改了内存位置(1.7)而另一个访问或修改了相同的内存位置,则两个表达式评估会发生冲突.
23 如果,两个行动可能同时发生
- 它们由不同的线程执行,或者
- 它们没有排序,至少有一个是由信号处理程序执行的.
程序的执行包含数据竞争,如果它包含两个可能同时发生冲突的动作,其中至少有一个不是原子的,并且除了下面描述的信号处理程序的特殊情况之外,它们都不会发生在另一个之前.任何此类数据争用都会导致未定义的行为.
纯粹的并发读取不会发生冲突,因此是安全的.
如果至少有一个线程写入内存位置,而另一个线程从该位置读取,则它们会发生冲突并可能并发.结果是数据争用,因此是未定义的行为,除非使用适当的同步,通过对所有读取和写入使用原子操作,或者通过使用同步原语在读取和写入之间的关系之前建立发生.
| 归档时间: |
|
| 查看次数: |
3678 次 |
| 最近记录: |