2020/4/18多线程写链表时的报错

报错内容:double free or corruption

这个报错的原因是:

1、多次释放同一内存区,需要检查代码,是否出现了对同以内存区释放两次以上的地方。
2、内存区溢出,malloc申请的内存区大小有限,如果操作不当,要存储的数据大于内存区大小,在free的时候也会检测出来,报这个错误

*** Error in `/tmp/server/cmake-build-debug/server': double free or corruption (!prev): 0x00007fc7dc0090c0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fc7e37ed7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7fc7e37f637a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fc7e37fa53c]
/tmp/server/cmake-build-debug/server[0x4010f3]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba)[0x7fc7e3b476ba]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7fc7e387d41d]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:01 812701                             /tmp/server/cmake-build-debug/server
00601000-00602000 r--p 00001000 08:01 812701                             /tmp/server/cmake-build-debug/server
00602000-00603000 rw-p 00002000 08:01 812701                             /tmp/server/cmake-build-debug/server
00603000-00604000 rw-p 00000000 00:00 0 
013cf000-013f0000 rw-p 00000000 00:00 0                                  [heap]
7fc7d4000000-7fc7d4022000 rw-p 00000000 00:00 0 
7fc7d4022000-7fc7d8000000 ---p 00000000 00:00 0 
7fc7dc000000-7fc7dc022000 rw-p 00000000 00:00 0 
7fc7dc022000-7fc7e0000000 ---p 00000000 00:00 0 
7fc7e155c000-7fc7e1572000 r-xp 00000000 08:01 397733                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fc7e1572000-7fc7e1771000 ---p 00016000 08:01 397733                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fc7e1771000-7fc7e1772000 rw-p 00015000 08:01 397733                     /lib/x86_64-linux-gnu/libgcc_s.so.1
7fc7e1772000-7fc7e1773000 ---p 00000000 00:00 0 
7fc7e1773000-7fc7e1f73000 rw-p 00000000 00:00 0 
7fc7e1f73000-7fc7e1f74000 ---p 00000000 00:00 0 
7fc7e1f74000-7fc7e2774000 rw-p 00000000 00:00 0 
7fc7e2774000-7fc7e2775000 ---p 00000000 00:00 0 
7fc7e2775000-7fc7e2f75000 rw-p 00000000 00:00 0 
7fc7e2f75000-7fc7e2f76000 ---p 00000000 00:00 0 
7fc7e2f76000-7fc7e3776000 rw-p 00000000 00:00 0 
7fc7e3776000-7fc7e3936000 r-xp 00000000 08:01 397695                     /lib/x86_64-linux-gnu/libc-2.23.so
7fc7e3936000-7fc7e3b36000 ---p 001c0000 08:01 397695                     /lib/x86_64-linux-gnu/libc-2.23.so
7fc7e3b36000-7fc7e3b3a000 r--p 001c0000 08:01 397695                     /lib/x86_64-linux-gnu/libc-2.23.so
7fc7e3b3a000-7fc7e3b3c000 rw-p 001c4000 08:01 397695                     /lib/x86_64-linux-gnu/libc-2.23.so
7fc7e3b3c000-7fc7e3b40000 rw-p 00000000 00:00 0 
7fc7e3b40000-7fc7e3b58000 r-xp 00000000 08:01 397841                     /lib/x86_64-linux-gnu/libpthread-2.23.so
7fc7e3b58000-7fc7e3d57000 ---p 00018000 08:01 397841                     /lib/x86_64-linux-gnu/libpthread-2.23.so
7fc7e3d57000-7fc7e3d58000 r--p 00017000 08:01 397841                     /lib/x86_64-linux-gnu/libpthread-2.23.so
7fc7e3d58000-7fc7e3d59000 rw-p 00018000 08:01 397841                     /lib/x86_64-linux-gnu/libpthread-2.23.so
7fc7e3d59000-7fc7e3d5d000 rw-p 00000000 00:00 0 
7fc7e3d5d000-7fc7e3d83000 r-xp 00000000 08:01 397667                     /lib/x86_64-linux-gnu/ld-2.23.so
7fc7e3f65000-7fc7e3f69000 rw-p 00000000 00:00 0 
7fc7e3f81000-7fc7e3f82000 rw-p 00000000 00:00 0 
7fc7e3f82000-7fc7e3f83000 r--p 00025000 08:01 397667                     /lib/x86_64-linux-gnu/ld-2.23.so
7fc7e3f83000-7fc7e3f84000 rw-p 00026000 08:01 397667                     /lib/x86_64-linux-gnu/ld-2.23.so
7fc7e3f84000-7fc7e3f85000 rw-p 00000000 00:00 0 
7ffe09398000-7ffe093b9000 rw-p 00000000 00:00 0                          [stack]
7ffe093dc000-7ffe093df000 r--p 00000000 00:00 0                          [vvar]
7ffe093df000-7ffe093e1000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

Process finished with exit code 134

程序运行一段时间,收到了几十个帧才出现这种情况 

在结点生成的地方会malloc动态申请内存,用于保存视频帧;

在调用线程函数th_fn的过程中,每次当链表长度大于19,就播放链表的第一帧视频,并释放掉该结点;

最后在每次线程结束后,需要对线程进行销毁

问题在于:如果两个线程都同时写入链表并播放,就有可能把同一结点释放两次!!

二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二二

在线程函数中插入结点,在主函数提取释放,还是会出现该报错

不播放,只生成结点,插入链表,也会报错

链表插入运行一段时间后,程序崩溃,自动退出


多线程的最大的特点是资源的共享,我们这里对一个链表进行操作,每次插入链表的动作都是相互独立的

但读取链表播放视频帧这个操作,是需要严格把控的

(除了对同一结点释放两次之外,还可能会出现:同一结点播放两次等情况)

错误的数据处理,会导致视频播放出现乱码、丢帧、重复播放、卡顿等情况......

当多个线程同时去操作(同时去改变)一个临界资源(这里指的是链表)时,会破坏临界资源,互斥锁解决这类问题!


总结:多线程比较复杂,要注意线程安全的问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值