多线程的堆内存共享问题
我做一个测试程序,三个线程,两个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。这是为什么呢?在线等。 展开
线程1:new出一个结构体,结构体值全部初始化为1。然后将指针push进入队列1.
线程2:从队列1中读取指针,根据指针,修改内存值,全部修改为2.并将指针push进入队列2.
线程3:从队列2读取指针,根据指针,打印出结构体的值,然后delete。
问题:用了10W条测试数据,在线程3中,每次都会有几条数据,在线程2中没有被修改。这是问什么呢?
问题:用了10W条测试数据,在线程3中打印结果(理论上打印的值都是2),但是多次用10W条数据测试,每次都会有几条数据,线程3打印结果仍然是1。这是为什么呢?在线等。 展开
2个回答
展开全部
这是典型的共享数据访问冲突,多个线程都有修改同一个共享数据时,就可能造成数据错乱。
解决的方法是使用操作系统提供的同步机制,保证访问的原子性,比如互斥锁等等。
解决的方法是使用操作系统提供的同步机制,保证访问的原子性,比如互斥锁等等。
追问
由于对两个队列都有互斥锁保护,还需要对内存进行保护么。
理论上,我第一个线程压入队列之后,就不会再对这块内存进行访问了。
当然第三个线程也不会,因为并未得到这块内存的指针。
追答
new 和 delete 也不一定是线程安全的,你可能需要确认一下你的runtime库。(仅供参考)
镭速传输
2024-10-28 广告
2024-10-28 广告
在深圳市云语科技有限公司,我们深知远程传输大文件的重要性与便捷性。为此,我们推荐使用高效的文件传输服务,这些服务通常支持断点续传,确保大文件传输的稳定与安全。用户只需简单上传,系统即可自动处理,无论文件大小,都能实现快速、可靠的远程传输。同...
点击进入详情页
本回答由镭速传输提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询