C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?

C++ Thread Safety: If only one thread can write to a non-atomic variable but multiple threads read from it.. can problems be encountered?

本文关键字:线程 问题 遇到 变量 读取 有一个 如果 安全 C++      更新时间:2023-10-16

如果一个线程读取另一个线程正在写入的非原子基元变量,它是否保证在写入之前或之后读取该值,或者它可以在写入过程中以某种方式读取某些损坏的版本?

我意识到诸如链表之类的集合是另一回事。

不,没有任何保证。

虽然我真的应该停在那里,因为它是一个完整的答案,但如果你认为"这怎么可能出错",请考虑一个对非原子变量的写入不是原子的实现。因此,如果您0x2F写然后写0x30,则另一个线程可能会在写入之前读取第一个半字节,然后在写入后读取第二个半字节并得到0x20

此外,假设一个非原子变量的值为零,并且此代码运行:

#define LAUNCH 1
#define DO_NOT_LAUNCH 0
if (war_has_been_declared)
non_atomic_variable = LAUNCH;
else
non_atomic_variable = DO_NOT_LAUNCH;

没有规则禁止实现将代码优化到:

non_atomic_variable = LAUNCH;
if (! war_has_been_declared)
non_atomic_variable = DO_NOT_LAUNCH;

这意味着即使没有宣战,另一个线程也可能会看到 LAUNCH 命令!

但重要的是要记住,根本就没有任何保证。不管你是否能想到一个合理的方式,它可能会出错。