假设我是世界上最好的超级黑客,我需要监控一个程序的行为,
为此,我创建了一个动态库或程序,它创建了几个线程,然后从内存中读取字节(通过原始指针或任何其他没有函数的直接内存获取模型)。这个“应该”是安全的吗?因为你能得到的唯一的东西就是一个格式错误的变量(例如,写是在你读的时候完成的)?然后忽略它,再读一遍?
我总是看到关于竞争条件、死锁和其他与多线程相关的问题的文档。但它们并不总是像我希望的那样清晰,我留下了一些悬而未决的问题。
如果一个线程写一块内存,而其他线程,比如3-4,不断地读取内存(假设一个非std::atomic int或float),并用它执行一些线程范围的操作(比如计算给定x,y,z向量的速度),那么这个程序就会安全地运行,并且会有定义的行为,或者会有UB,或者应用程序在某个时刻崩溃?(也许格式错误的浮点字节的倍增会导致崩溃?)
如果它不安全,有没有一种方法可以“安全地”从几个线程的一块内存中获取内存内容,而不需要访问目标程序的内部?
发布于 2013-07-06 13:56:27
你最关心的是官方的C++答案,还是实用的答案?
C++的官方回答是,不加锁的同时读写可能/将导致竞争条件,从而产生未定义的行为--任何事情都可能发生。
更实际的答案是,对于任何设计良好的CPU,最糟糕的情况是你会得到一个不正确的值。对于您的代码来说,试图在没有锁的情况下读取数据是一个bug,但如果因为两个线程的读/写冲突而导致可怕的事情发生,那么CPU (至少)也是一个bug。如果写入变量不是原子的,那么完全允许您获得一个部分写入的值--但是使机器崩溃或类似的事情将是CPU的一个主要错误。
发布于 2013-07-06 13:47:04
从多个线程读取和写入相同的数据对象会产生未定义的行为,并且未定义的行为不会导致崩溃,它只是意味着程序可以显示任何行为。简单地说,你不能依赖行为的一致性,因为它根本不是按照标准强制执行的。
访问此类对象的唯一安全方法是确保:
通过锁进行的
https://stackoverflow.com/questions/17500066
复制相似问题