<分区>
如果在一个线程上我将写入原始类型变量,例如 int
,而另一个线程正在读取它,是否有可能读取部分修改的数据,如更复杂的数据类型?
如果是,那么我唯一的拯救方法是 atomic
或 mutex
还是有性能开销较小的解决方案?
<分区>
如果在一个线程上我将写入原始类型变量,例如 int
,而另一个线程正在读取它,是否有可能读取部分修改的数据,如更复杂的数据类型?
如果是,那么我唯一的拯救方法是 atomic
或 mutex
还是有性能开销较小的解决方案?
最佳答案
在理论上(以及现实生活中),是的。您必须同步对不同线程读取和写入的变量的访问。
一些硬件架构可能不需要同步(在这种情况下,一个有能力的编译器应该直接删除它),但是一些架构有非常松散的保证(比如 DEC Alpha - 和其他)并且同步非常非常需要。
为了跨实现可移植和可预测的结果,您必须同步对变量的访问。部分读/写可能发生(通常在晚上 3 点,当每个人都在休假时,您最重要的客户)。
更不用说缺乏同步这一事实,您的程序包含数据竞争,而数据竞争根据定义是未定义的行为。一旦您的程序包含 UB(任何地方),您的编译器就不再对其可能生成的代码有任何限制(对于您的程序的所有)。因此,即使硬件保证它是安全的,编译器也可能会利用理论 UB 的存在来执行会破坏您的程序的优化 - 而不一定是您期望破坏发生的地方。
关于c++ - 在 C++ 中使用多线程时是否可以读取写了一半、损坏的原始变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56780384/