免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
61 [报告]
发表于 2007-05-30 12:33 |只看该作者
是不是要做到信号安全,就要全部使用局部变量?

论坛徽章:
0
62 [报告]
发表于 2007-05-30 13:25 |只看该作者
自己封装一下
使用互斥锁封住malloc和free

论坛徽章:
0
63 [报告]
发表于 2008-01-30 20:17 |只看该作者
这个讨论不错,很多概念我原来也是模棱两可的.

总结:不写多线程程序才是王道~~

论坛徽章:
0
64 [报告]
发表于 2008-01-30 20:31 |只看该作者
malloc 自己会用锁, 可以放心地在THREAD中使用.

但无法在信号中正常用.

论坛徽章:
0
65 [报告]
发表于 2008-01-30 20:31 |只看该作者
有意思,看了这个文章之后,
http://i-love-mzd.blog.sohu.com/76609080.html

给我的感觉是 可重入的条件要更强于线程安全,也就是说满足线程安全的条件是满足可重入条件的子集,一个函数是可重入的,那么一定是线程安全的;反之不然

但是信号安全的概念有点模糊了,似乎APUE里面没有提及吧?

论坛徽章:
0
66 [报告]
发表于 2008-01-30 20:41 |只看该作者
重入就是一个执行还正在其中, 另一个执行又来了. (重新进入).
标志*近似地*可以这样判断: 在FUNC中设置一个static变量,进来时候++, 返回之前--,
如果该FUNCTION在某时刻变量大于1了,就是被重入了.

THREAD安全的必须是可重入.反之也然.
但不是所有的可重入的都是信号安全的.

论坛徽章:
0
67 [报告]
发表于 2008-01-30 21:07 |只看该作者
呵呵,思版主的那个关于可重入例子的还真是没想到。
我原来一直以为可重入就只包含线程安全和信号安全呢,现在理解更深刻了。

补充提到的思版主提出的那个问题连接:
http://bbs.chinaunix.net/thread-1048986-1-1.html

[ 本帖最后由 cugb_cat 于 2008-1-31 00:26 编辑 ]

论坛徽章:
0
68 [报告]
发表于 2008-01-30 21:10 |只看该作者
还可以继续思考

为什么不是所有的可重入FUNCTION都是信号安全的?本质原因是什么?

什么样的是信号安全的? 

论坛徽章:
0
69 [报告]
发表于 2008-01-30 21:19 |只看该作者
原帖由 思一克 于 2008-1-30 20:41 发表
重入就是一个执行还正在其中, 另一个执行又来了. (重新进入).
标志*近似地*可以这样判断: 在FUNC中设置一个static变量,进来时候++, 返回之前--,
如果该FUNCTION在某时刻变量大于1了, ...

我觉得信号安全应该也属于可重入的范畴吧?

论坛徽章:
0
70 [报告]
发表于 2008-09-02 16:16 |只看该作者
今天做了一个实验, 测试了所谓的malloc"不可重入"性:




  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. #include <time.h>
  6. #include <sys/time.h>

  7. int SetTimer()
  8. {
  9.     struct itimerval interval;
  10.         
  11.         interval.it_interval.tv_sec = 0;
  12.         interval.it_interval.tv_usec = 1;
  13.         interval.it_value.tv_sec = 1;
  14.         interval.it_value.tv_usec = 0;

  15.         if (::setitimer(ITIMER_REAL, &interval, NULL))
  16.     {
  17.                 return -1;
  18.         }   

  19.     return 0;
  20. }

  21. void Handler(int nSigNo)
  22. {
  23.     printf("ALARM signal!\n");
  24.     char *p = (char*)malloc(rand() % 40960)
  25.     free(p);
  26. }

  27. int main()
  28. {
  29.     SetTimer();

  30.     signal(SIGALRM, Handler);

  31.     while (1)
  32.     {
  33.         char *p = (char*)malloc(rand() % 40960);
  34.         free(p);
  35.     }

  36.     return 0;
  37. }


复制代码


定义一个每微秒触发的定时器, 触发时产生alarm信号, 在信号处理函数中调用malloc/free, 程序的主循环也调用malloc/free,马上程序就停住了,strace看了一下进程, 死锁了.

也就是说,所谓的"不可重入"指的就是不能在两个或以上的地方(在这个例子中是程序主循环和信号处理函数)同时调用的函数就是不可重入函数.

[ 本帖最后由 converse 于 2008-9-3 09:49 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP