c++ - 从没有锁的多个线程读取动态/变化的数据?它会导致崩溃吗?或者只是损坏的变量?

标签 c++ multithreading memory-management

假设我是世界上最好的 super 黑客,我需要监控一个程序的行为,

我通过创建一个动态库或程序来实现这一点,它创建几个线程,然后只从内存中读取字节(通过原始指针或任何其他没有函数的直接内存获取模型)。这个“应该”安全吗?因为你唯一能得到的只是一个格式错误的变量(例如,当你读的时候写就完成了)?然后忽略它并再次阅读?

我经常看到有关竞争条件、死锁和其他与多线程相关的问题的文档。但它们并不总是像我希望的那样清晰,我留下了悬而未决的问题。

如果一个线程写入一 block 内存,而其他线程,如 3-4,不断读取内存(假设一个非 std::atomic int 或 float)并用它执行一些线程范围的操作(如计算给定 x、y、z vector 的速度),那么这个程序会安全运行并且会有定义的行为,或者会不会有 UB,或者可能在某个时候应用程序崩溃? (也许错误的浮点字节的乘法会导致崩溃?)

如果它不安全,是否有一种方法可以在不访问目标程序内部的情况下“安全地”从几个线程的一 block 内存中获取内存内容?

最佳答案

您主要关心官方 C++ 答案还是实用答案?

官方的 C++ 答案是在没有锁定的情况下同时读取和写入会/将导致竞争条件,这会产生未定义的行为——任何事情都可能发生。

更实际的答案是,对于任何设计良好的 CPU,最坏的情况是您会得到一个不正确的值。对于您的代码来说,尝试在没有锁定的情况下读取数据是一个错误,但它(至少)同样是 CPU 的一个错误,如果它让任何可怕的事情发生,因为两个线程有​​冲突的读/写。如果写入变量不是原子的,则完全允许您获得部分写入的值——但崩溃机器或类似的东西将是 CPU 方面的主要错误。

关于c++ - 从没有锁的多个线程读取动态/变化的数据?它会导致崩溃吗?或者只是损坏的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17500066/

相关文章:

java - Java Spring框架: Multiple Threads and TaskExecutor

c - 编译器优化会影响动态内存分配吗?

delphi - 我需要释放动态创建的表单吗?

c++ - 如何使用 boost::simple_segregated_storage?

c++ - Double 到 Float 类型的转换 -- 为什么我不能将 (double)20150813.00 转换为 (float)20150813.00?

c++ - 为什么使用 Boost pool ordered_free() 而不是 free()?

c++ - char* t=new char 和 char* t=new char[10] 之间有什么不同;

c++ - 不锁定 pthread_cond_timedwait 和 pthread_cond_signal 的互斥量(在 Linux 上)

C# 应用程序域到底是什么?

c - free() 是在所有深度还是仅在最高级别释放内存?