繁体   English   中英

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?

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

我意识到像链表这样的集合是另一回事。

不,没有任何保证。

虽然我真的应该停在那里,因为它是一个完整的答案,但如果您认为“这怎么可能 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM