假设我是世界上最好的 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/