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

问题描述

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

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

标签: c++concurrency

解决方案


不,没有任何保证。

虽然我真的应该停在那里,因为这是一个完整的答案,但如果您认为“这怎么可能出错”,请考虑一个对非原子变量的写入不是原子的实现。因此,如果您先0x2Fwrite 然后 write 0x30,则另一个线程可能会在 write 之前读取第一个 nibble,然后在 and get 之后读取第二个 nibble 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 命令!

但重要的是要记住,根本没有任何保证。你是否能想出一个可能出错的合理方法并不重要。


推荐阅读