0

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

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

我总是看到有关竞争条件、死锁和其他与多线程相关的问题的文档。但它们并不总是像我希望的那样清晰,而且我还有很多未回答的问题。

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

如果它不安全,有没有办法“安全地”从几个线程的一块内存中获取内存内容,而无需访问目标程序内部?

4

2 回答 2

2

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

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

更实际的答案是,对于任何设计得体的 CPU,最坏的情况是你会得到一个不正确的值。对于您的代码而言,尝试在没有锁定的情况下读取数据是一个错误,但如果由于两个线程的读/写冲突而导致任何可怕的事情发生,那么它(至少)同样是 CPU 的一个错误。如果写入变量不是原子的,那么完全允许您获得部分写入的值——但是使机器崩溃或类似的事情将是 CPU 的一个主要错误。

于 2013-07-06T05:56:26.820 回答
2

从多个线程读取和写入相同的数据对象会给您带来未定义的行为,并且未定义的行为不会导致崩溃,它只是意味着程序可以显示任何行为。简而言之,您不能依靠行为来保持一致,因为它根本不是根据标准强制执行的。

访问此类对象的唯一安全方法是确保:

  • 通过锁的原子和同步访问
于 2013-07-06T05:47:04.487 回答