求助,多线程,malloc死锁??!
本人接触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?恳请各位大神求解,这是什么原因导致的??
好了,开始介绍问题:
主进程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?恳请各位大神求解,这是什么原因导致的??
...全文
相关推荐
定位多线程内存越界问题实践总结
这些现象表明问题可能与多线程竞争条件有关,即多个线程并发访问和修改同一块内存导致的错误。在尝试解决问题的过程中,开发者首先考虑了使用glibc的MALLOC_CHECK_环境变量。
深入剖析malloc重入陷阱:从__lll_lock_wait_private看线程安全与死锁防范
本文深入剖析了malloc在多线程环境下因信号中断导致的重入死锁问题。通过分析__lll_lock_wait_private调用栈,揭示了glibc内存分配器线程安全但不可重入的特性,并提供了信号处理函数安全编程准则与多线程环境下的规避策略,帮助开发者防范此类隐蔽死锁。
linux的多线程编程的高效开发经验借鉴.pdf
使用时要注意避免死锁和活锁,确保在调用`wait`前解锁互斥锁,`signal`或`broadcast`后及时重置状态。6.
sym_malloc.rar_The Family
**并发控制**:在多线程环境下,驱动程序需要处理并发访问内存的情况,防止数据竞争和死锁,可能使用锁或其他同步原语来实现。6.
malloc为那些招摇的人_malloc for those who swag.zip
此外,由于现代计算机架构的复杂性,一个好的内存分配器还需要能够兼容多线程环境,避免竞争条件和死锁的发生,保证内存操作的原子性。


