[英]C++ Thread Safety: If only one thread can write to a non-atomic variable but multiple threads read from it.. can problems be encountered?
如果一个线程读取另一个线程正在写入的非原子原始变量,它是否保证在写入之前或之后读取该值,或者它可以在写入期间以某种方式读取一些损坏的版本?
我意识到像链表这样的集合是另一回事。
不,没有任何保证。
虽然我真的应该停在那里,因为它是一个完整的答案,但如果您认为“这怎么可能 go 错误”,请考虑一个对非原子变量的写入不是原子的实现。 因此,如果您写入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 命令!
但重要的是要记住,根本没有任何保证。 不管你是否能想到一个合理的方法,它可以 go 错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.