c++ - 在 C++ 中使用多线程时是否可以读取写了一半、损坏的原始变量?

标签 c++ multithreading concurrency race-condition memory-corruption

<分区>

如果在一个线程上我将写入原始类型变量,例如 int,而另一个线程正在读取它,是否有可能读取部分修改的数据,如更复杂的数据类型?

如果是,那么我唯一的拯救方法是 atomicmutex 还是有性能开销较小的解决方案?

最佳答案

在理论上(以及现实生活中),是的。您必须同步对不同线程读取和写入的变量的访问。

一些硬件架构可能不需要同步(在这种情况下,一个有能力的编译器应该直接删除它),但是一些架构有非常松散的保证(比如 DEC Alpha - 和其他)并且同步非常非常需要。

为了跨实现可移植和可预测的结果,您必须同步对变量的访问。部分读/写可能发生(通常在晚上 3 点,当每个人都在休假时,您最重要的客户)。

更不用说缺乏同步这一事实,您的程序包含数据竞争,而数据竞争根据定义是未定义的行为。一旦您的程序包含 UB(任何地方),您的编译器就不再对其可能生成的代码有任何限制(对于您的程序的所有)。因此,即使硬件保证它是安全的,编译器也可能会利用理论 UB 的存在来执行会破坏您的程序的优化 - 而不一定是您期望破坏发生的地方。

关于c++ - 在 C++ 中使用多线程时是否可以读取写了一半、损坏的原始变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56780384/

相关文章:

c# - 使用约束 delaunay 三角剖分对多边形进行三角剖分

c++ - 如何调试仅作为独立应用程序死锁的多线程程序

java - 这个同步块(synchronized block)内发生了什么

java - 在 Java 中模拟多个客户端调用单个服务器类

python - 在Python asyncio中创建并发任务之间的依赖关系

Java、EJB、所有方法的并发锁

c++ - 在 OpenCV 中编译警告并且没有输出

c++ - 错误 :conversion from 'QFont' to non-scalar type 'QFontMetricsF' requested-Qt

multithreading - 如何实现线程库?

c++ - 只为一种widget设置样式