免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cugb_cat
打印 上一主题 下一主题

malloc 的可重入性 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2007-05-29 23:51 |只看该作者
原帖由 MMMIX 于 2007-5-29 23:43 发表

未必,如果真的对线程而言其是“原子操作”,那么显然你可以在线程的信号处理函数中调用该函数,即使该函数执行到一半被信号中断。

有两种不同的重入:
1、多个线程同时调用某函数;
2、某函数执行到一半的 ...


确实存在这个问题,针对于中断不是原子操作。
ypying提到的那个问题感觉有那么点意思~
如果“递归”调用使用锁实现的可重入函数,可能就成死锁了~~
呵呵,有时间研究下代码~~~

论坛徽章:
0
52 [报告]
发表于 2007-05-29 23:54 |只看该作者
原帖由 cugb_cat 于 2007-5-29 23:51 发表


确实存在这个问题,针对于中断不是原子操作。
ypying提到的那个问题感觉有那么点意思~
如果“递归”调用使用锁实现的可重入函数,可能就成死锁了~~
呵呵,有时间研究下代码~~~


俺叫ypxing

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
53 [报告]
发表于 2007-05-29 23:54 |只看该作者
原帖由 cugb_cat 于 2007-5-29 23:51 发表


确实存在这个问题,针对于中断不是原子操作。
ypying提到的那个问题感觉有那么点意思~
如果“递归”调用使用锁实现的可重入函数,可能就成死锁了~~
呵呵,有时间研究下代码~~~

我倒是觉得有时间应该先找些理论方面的资料看看,反正我是这么打算的

论坛徽章:
0
54 [报告]
发表于 2007-05-30 06:26 |只看该作者
^_^,学了一点,谢谢,学到现在发现越来越迷惘了,好像很多东西都不敢用,很多东西又用不好。

论坛徽章:
0
55 [报告]
发表于 2007-05-30 09:05 |只看该作者
原帖由 ypxing 于 2007-5-29 23:54 发表


俺叫ypxing

sorry~~
这次记住了

论坛徽章:
0
56 [报告]
发表于 2007-05-30 09:14 |只看该作者
原帖由 ypxing 于 2007-5-29 20:40 发表


The  strtok_r()  function is a reentrant version strtok().

难道strtok_r()不是线程安全的么?

论坛徽章:
0
57 [报告]
发表于 2007-05-30 09:16 |只看该作者
连接pthread库,LIB的多数函数如malloc都应该是THREAD安全的了。否则什么都要自己枷锁那也太麻烦了。

论坛徽章:
0
58 [报告]
发表于 2007-05-30 09:38 |只看该作者
如果你在用glibc,那就是可重入的,看一下源代码不就得了,作者已经明确表示是可重入的了

论坛徽章:
0
59 [报告]
发表于 2007-05-30 10:44 |只看该作者
http://ftp.gnu.org/gnu/glibc/gli ... glibc-2.0.1/malloc/
Malloc implementation for multiple threads without lock contention.


  On many systems, the standard malloc implementation is by itself not
  thread-safe, and therefore wrapped with a single global lock around
  all malloc-related functions.  In some applications, especially with
  multiple available processors, this can lead to contention problems
  and bad performance.  This malloc version was designed with the goal
  to avoid waiting for locks as much as possible.  Statistics indicate
  that this goal is achieved in many cases.



链接在这里:
http://www.google.com/codesearch ... /malloc/malloc.c#a0

论坛徽章:
0
60 [报告]
发表于 2007-05-30 11:32 |只看该作者

malloc不可重入但是是线程安全的

个人在Linux上(RH9及其以后的内核)的一点经验。
三个概念,线程安全,可重入函数,信号安全函数。
线程安全,主要是针对数据竞争来说的,就是说:如果数据不需要共享,那就让每个线程私有;如果需要共享,那就加锁。
可重入:就是无论以什么方式多次调用都不会出现问题,不会出现对可能有修改的静态数据的访问,不会出现对全局变量的访问。如果一个函数是可重入的,那一定是线程安全的,反之则不一定。
信号安全,其实也就是异步信号安全,是说线程在信号处理函数当中,不管以任何方式调用你的这个函数如果不死锁不修改数据,那就是信号安全的。也就是说一个可重入函数在信号处理函数当中不影响调用他的人本身的状态,其实就是一个task_struct有很多指针指向它,你通过多线程调一个可重入函数,函数有自己所在的task的代码段和数据段,如果你在信号处理里面调它,实际上是换了一个指向同一个task_struct里面内容的指针来操作,会有问题。这种情形通过加锁是解决不了问题的,比如你正在调用printf过程中,遇到一个信号,转而去处理这个信号,并且在处理这个信号的信号处理函数当中正巧要调用printf,那么屏幕上就是乱的,加锁行不行呢?那就很好玩了。所以printf不是异步信号安全的。
不知道绕来绕去说清楚没有。

总结:信号安全要求最高,可重入次之,线程安全更次之。

Linux实际编程经验,对于多线程程序,调用线程安全就可以了,能重入最好,但是不强求,多线程调用malloc是可以的。但是,在安装信号处理程序的时候,看看你自己调用的是不是异步信号安全函数,怎么看?很简单,所有异步信号安全的函数在他的man中会十分明确的指出来,没有指出的一律就是不安全的。

有问题欢迎指正。

评分

参与人数 1可用积分 +3 收起 理由
langue + 3

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP