【问题标题】:Reading dynamic/changing data from multiple threads without locks? Can it cause a crash? Or just corrupted variables?从没有锁的多个线程中读取动态/更改数据?它会导致崩溃吗?或者只是损坏的变量?
【发布时间】:2013-07-06 05:41:20
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c++ multithreading memory-management


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      • 通过锁的原子和同步访问

      【讨论】:

        猜你喜欢
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        • 2018-06-01
        • 1970-01-01
        • 2022-08-20
        • 1970-01-01
        • 2016-10-01
        相关资源
        最近更新 更多