malloc是否是线程安全的?

本文探讨了在Linux环境下,GCC版本4.6.1及libc-dev3.0.0-14.23中malloc函数的线程安全性问题。通过实验发现,当程序使用了pthread相关函数时,即使未真正创建线程,链接器也会默认使用线程安全版本的malloc。
摘要由CSDN通过智能技术生成

只在Linux下查看了malloc的使用情况:

GCC版本4.6.1

libc-dev 3.0.0-14.23

//============================================================

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

下面的链接对此有描述,几年前的版本可能是这样的:

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

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

//============================================================

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

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

//====================

测试结果:

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

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

//====================

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

但没有使用pthread_attr_initpthread_createh函数,编译后的malloc函数就是非线程安全的

//====================

但如果使用了pthread_attr_initpthread_createh函数,编译后的malloc函数就是线程安全的

即使你只是使用了一次pthread_createh(NULL,NULL,NULL,NULL);

//============================================================

我以前从没考虑过malloc是否是线程安全的这回事,反正就直接用了。

使用glibc时可以在官网上下载手册,如果函数是非线程安全的,在函数下面会有一行说明(好像只有很少几个是非线程安全的)。

虽然malloc下面没有说明,但我还是观察了一下,算是解开自己的疑惑吧。

//============================================================

End:)

转载于:https://www.cnblogs.com/tomren/archive/2011/12/24/2300602.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值