多线程的堆内存共享问题

我做一个测试程序,三个线程,两个queue队列。线程1:new出一个结构体,结构体值全部初始化为1。然后将指针push进入队列1.线程2:从队列1中读取指针,根据指针,修... 我做一个测试程序,三个线程,两个queue队列。
线程1:new出一个结构体,结构体值全部初始化为1。然后将指针push进入队列1.
线程2:从队列1中读取指针,根据指针,修改内存值,全部修改为2.并将指针push进入队列2.
线程3:从队列2读取指针,根据指针,打印出结构体的值,然后delete。

问题:用了10W条测试数据,在线程3中,每次都会有几条数据,在线程2中没有被修改。这是问什么呢?
问题:用了10W条测试数据,在线程3中打印结果(理论上打印的值都是2),但是多次用10W条数据测试,每次都会有几条数据,线程3打印结果仍然是1。这是为什么呢?在线等。
展开
 我来答
john_lee1969
2014-06-26 · TA获得超过1697个赞
知道小有建树答主
回答量:419
采纳率:100%
帮助的人:521万
展开全部
这是典型的共享数据访问冲突,多个线程都有修改同一个共享数据时,就可能造成数据错乱。
解决的方法是使用操作系统提供的同步机制,保证访问的原子性,比如互斥锁等等。
追问
由于对两个队列都有互斥锁保护,还需要对内存进行保护么。

理论上,我第一个线程压入队列之后,就不会再对这块内存进行访问了。

当然第三个线程也不会,因为并未得到这块内存的指针。
追答
new 和 delete 也不一定是线程安全的,你可能需要确认一下你的runtime库。(仅供参考)
镭速传输
2024-10-28 广告
在深圳市云语科技有限公司,我们深知远程传输大文件的重要性与便捷性。为此,我们推荐使用高效的文件传输服务,这些服务通常支持断点续传,确保大文件传输的稳定与安全。用户只需简单上传,系统即可自动处理,无论文件大小,都能实现快速、可靠的远程传输。同... 点击进入详情页
本回答由镭速传输提供
亮仔同学
2014-06-26 · 超过10用户采纳过TA的回答
知道答主
回答量:28
采纳率:0%
帮助的人:24.6万
展开全部
有没有用到线程间的同步?
更多追问追答
追问
放指针的队列用了保护,内存本身没有加。但是各个线程都是通过指针对那个内存块进行访问的,既然多个线程不会同时使用这个指针操作,那么还需要对内存操作加保护么。
追答
队列加了只是互斥,但你必须保证你先执行线程2再执行线程3。没有同步的话,先执行哪个线程是不一定的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式