论malloc线程安全

论malloc线程安全

在开发过程中遇到进程死锁的情况,通过gdb看运行情况如下: 

死锁过程分析:

  1. operator new 第一次调用malloc
  2. signal_handler(int) () 收到信号,处理信号的过程中第二次调用了malloc (),然后死锁

信号的到来是不确定的,而好多函数是可以被信号打断的, 比如在当前程序 正在调用malloc 分配一片内存(还尚未执行完),突然来了个信号被打断了,去执行信号函数了,而信号函数中又去调用了一次malloc,完了,死锁了。

libc中有非线程安全/线程安全两个版本malloc函数

通过 -pthreads 选项可以明确指定在链接时是链接非线程安全的版本还是线程安全的版本。(只是几年前的版本)

http://stackoverflow.com/questions/987444/about-thread-safety-in-malloc-and-free

如今使用的版本中已经没有-pthreads这个选项了,但更智能些:

会智能选择使用非线程安全/线程安全的malloc函数

网上查询结果:

只要使用了线程相关的函数,在编译后的文件中使用的malloc函数就是线程安全的版本。

(链接器不会考虑你是否真的启动了线程,或是否真的使用了那个线程)

即:在文件中引用了头文件#include<pthread.h>,编译时使用-lpthread选项,文件中使用了pthread_t定义变量,

1、没有使用pthread_attr_init或pthread_createh函数,编译后的malloc函数就是非线程安全的。

2、如果使用了pthread_attr_init或pthread_createh函数,编译后的malloc函数就是线程安全的。即使你只是使用了一次pthread_createh(NULL,NULL,NULL,NULL);

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据