多线程的堆内存共享问题
我做一个测试程序,三个线程,两个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库。(仅供参考)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询