求助,多线程,malloc死锁??!

EchoPro 2016-03-11 10:41:40
本人接触Linux C不久,最近在项目中遇到多线程死锁问题,求大神指点!!
好了,开始介绍问题:
主进程pthread_create4个线程,在运行过程中发现死锁问题,下面是gdb attach进去后观察到的程序堆栈信息:

#0 0x000000347d6f4e6e in __lll_lock_wait_private () from /lib64/libc.so.6
#1 0x000000347d67bae8 in _L_lock_9164 () from /lib64/libc.so.6
#2 0x000000347d679482 in malloc () from /lib64/libc.so.6
#3 0x000000347d66e158 in open_memstream () from /lib64/libc.so.6
#4 0x000000347d6e199b in __vsyslog_chk () from /lib64/libc.so.6
#5 0x000000347d66f6fe in __libc_message () from /lib64/libc.so.6
#6 0x000000347d6750c6 in malloc_printerr () from /lib64/libc.so.6
#7 0x000000347d678808 in _int_malloc () from /lib64/libc.so.6
#8 0x000000347d67948d in malloc () from /lib64/libc.so.6

查看最后调用的代码,并没有发现什么异常,只是调用了malloc分配内存:
1041 pakiet->data = malloc(datalen);

我知道malloc是线程不安全的,但是程序中并未使用信号,线程堆栈中为何多次进入malloc?恳请各位大神求解,这是什么原因导致的??
...全文
2528 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Datrilla 2018-03-16
  • 打赏
  • 举报
回复
我看到的 malloc是线程安全 但是异步信号不安全
常书 2016-03-23
  • 打赏
  • 举报
回复
你在调用 malloc的地方加后印的话,是不是会出现很多打印,也就是程序跑起来会多次调用malloc,如果是这样,只能在外面加信号量/mutex控制了
七十二寨寨主 2016-03-21
  • 打赏
  • 举报
回复
做这么多年C/C++开发,还头一回听说malloc线程安全问题,以前也从没想到过,一直以为malloc就是线程安全的。 http://www.cnblogs.com/tomren/archive/2011/12/24/2300602.html 也学习了。 觉得你这问题不应该是malloc本身的问题,建议从更多的角度检查一下。
jlovej1314 2016-03-18
  • 打赏
  • 举报
回复
首先是int_malloc发现了malloc有错误,然后调用malloc_printerr 要打印错误日志的时候 出现了死锁。 而malloc产生错误的原因,一般是内存越界、使用已释放的内存等。 针对此类问题,可以使用Valgrind工具,也可以‘export MALLOC_CHECK_=1’然后再运行看看。
jlovej1314 2016-03-18
  • 打赏
  • 举报
回复
export MALLOC_CHECK_=1
renwotao2009 2016-03-13
  • 打赏
  • 举报
回复
有可能是malloc调用的其他函数中也用到了malloc,建议你在malloc分配内存时加上临界区或mutex保证线程安全。

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧