首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在没有锁的情况下从多个线程读取动态/变化的数据?它会导致崩溃吗?或者仅仅是被破坏的变量?

在没有锁的情况下从多个线程读取动态/变化的数据?它会导致崩溃吗?或者仅仅是被破坏的变量?
EN

Stack Overflow用户
提问于 2013-07-06 13:41:21
回答 2查看 921关注 0票数 0

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

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-06 13:56:27

你最关心的是官方的C++答案,还是实用的答案?

C++的官方回答是,不加锁的同时读写可能/将导致竞争条件,从而产生未定义的行为--任何事情都可能发生。

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-06 13:47:04

从多个线程读取和写入相同的数据对象会产生未定义的行为,并且未定义的行为不会导致崩溃,它只是意味着程序可以显示任何行为。简单地说,你不能依赖行为的一致性,因为它根本不是按照标准强制执行的。

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

通过锁进行的

  • 原子和同步访问
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17500066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档