malloc函数是一个我们经常使用的函数,如果不对会造成一些潜在的问题。下面就malloc函数的线程安全性和可重入性做一些分析。

我们知道一个函数要做到线程安全,需要解决多个线程调用函数时访问共享资源的冲突。而一个函数要做到可重入,需要不在函数内部使用静态或全局数据,不返回静态或全局数据,也不调用不可重入函数。

malloc函数线程安全但是不可重入的,因为malloc函数在用户空间要自己管理各进程共享的内存链表,由于有共享资源访问,本身会造成线程不安全。为了做到线程安全,需要加锁进行保护。同时这个锁必须是递归锁,因为如果当程序调用malloc函数时收到信号,在信号处理函数里再调用malloc函数,如果使用一般的锁就会造成死锁(信号处理函数中断了原程序的执行),所以要使用递归锁。

虽然使用递归锁能够保证malloc函数的线程安全性,但是不能保证它的可重入性。按上面的场景,程序调用malloc函数时收到信号,在信号处理函数里再调用malloc函数就可能破坏共享的内存链表等资源,因而是不可重入的。

至于malloc函数访问内核的共享数据结构可以正常的加锁保护,因为一个进程程调用malloc函数进入内核时,必须等到返回用户空间前夕才能执行信号处理函数,这时内核数据结构已经访问完成,内核锁已释放,所以不会有问题。
---------------------
作者:无忧V
来源:CSDN
原文:https://blog.csdn.net/weiganyi/article/details/11142347
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. HFS远程命令执行漏洞入侵抓鸡黑阔服务器
  2. 重置mysql数据库密码
  3. 移动端HTML5开发心得(转)
  4. [转]AS3复制可视对象
  5. linux命令介绍:df使用介绍
  6. Table View滑动时报错
  7. jQuery练习一好友列表变色
  8. Hibernate悲观锁/乐观锁
  9. 分布式内存对象缓存 memcached
  10. 【ROC曲线】关于ROC曲线、PR曲线对于不平衡样本的不敏感性分析说引发的思考
  11. 在C++中打印出变量的方法
  12. jQuery扩展extend一
  13. Linux系统基础命令
  14. 学习通过Thread+Handler实现非UI线程更新UI组件(转)
  15. [ionic3.x开发记录]ng-content使用
  16. WorldWind源码剖析系列:星球类World
  17. 高能天气——团队Scrum冲刺阶段-Day 6
  18. js 控制页面跳转的5种方法
  19. 关于C++中的string的小知识点
  20. C++_代码重用3-私有继承

热门文章

  1. 史融资2.5亿的“自主国产”红芯浏览器,其实是个套壳Chrome
  2. 20169219 实验二 Java面向对象程序设计
  3. [算法基础]Big O Notation时间复杂度计算方法
  4. Js 正则获取Html元素
  5. MQ入门总结(一)消息队列概念和使用场景
  6. C#英文面试常见问题[转]
  7. Android TV 开发 (1)
  8. Linux日常命令使用记录
  9. C语言字符串拼接
  10. [转载]ssget 用法详解 by yxp