C++ 线程安全 : If only one thread can write to a non-atomic variable but multiple threads read from it.。可以遇到问题吗?

标签 c++ concurrency

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

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

最佳答案

不,没有任何保证。

虽然我真的应该停在那里,因为这是一个完整的答案,但如果您认为“这怎么可能出错”,请考虑一个对非原子变量的写入不是原子的实现。所以如果你写了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 命令!

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

关于C++ 线程安全 : If only one thread can write to a non-atomic variable but multiple threads read from it.。可以遇到问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62440760/

相关文章:

python - Django1.6 IntegrityError 尽管有 transaction.atomic()?

c++ - 这些c++语法等同于什么?

c++ - 如何在 Eigen3 中 reshape 张量?

c++ - 如何在 Xcode 中将图像添加到 C++ 项目

java - 如果我从多个线程使用 JSch,我应该如何使用它

c# - TPL 数据流在运行时中断 LinkTo()

c++ - 为什么不能默认模板模板参数?

c++ - 在纯虚拟基类的名称前面是否有字母 'I' 的值,这在 C#/Java 中很常见?

java - 使用多个并发线程执行一组测试方法

java - 哪些 Java 并发类可能对我有帮助?