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?
如果一个线程读取另一个线程正在写入的非原子基元变量,它是否保证在写入之前或之后读取该值,或者它可以在写入过程中以某种方式读取某些损坏的版本?
我意识到诸如链表之类的集合是另一回事。
不,没有任何保证。
虽然我真的应该停在那里,因为它是一个完整的答案,但如果你认为"这怎么可能出错",请考虑一个对非原子变量的写入不是原子的实现。因此,如果您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 命令!
但重要的是要记住,根本就没有任何保证。不管你是否能想到一个合理的方式,它可能会出错。
相关文章:
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- MFC执行线程问题
- 提升线程问题,当一个线程与另一个线程没有相同的副本时如何共享变量?
- VS2017 Linux C 线程问题
- 由于线程问题,Qt-Gui没有更新
- shared_ptr和线程问题
- 线程问题
- 奇怪的线程问题
- 显示Q对话框时出现QT线程问题
- gdal多线程问题
- Qt:QList线程问题
- C#封送以调用C++DLL.COM和线程问题
- C++ 线程问题
- C++11 多线程问题
- 消息框线程问题
- boost::d ynamic_bitset 多线程问题
- 标准::线程问题
- Android 的 c++11 多线程问题,其中某些线程未正确调度
- C++ 提升线程问题
- concurrent_vector vs 矢量与互斥锁,线程问题与push_back