免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2007-05-29 22:45 |只看该作者
重入和多线程有什么关系,求解。

论坛徽章:
0
32 [报告]
发表于 2007-05-29 22:47 |只看该作者
原帖由 MMMIX 于 2007-5-29 17:52 发表

http://www.unet.univie.ac.at/aix ... hread_safe_code.htm

建议看看,reentrancey 和 thread safety 是两个不同的概念。

呵呵,收了先~~
可重入和线程安全这两个概念我还是分的不是太明了。
APUE中说malloc可能被信号中断,从而导致重入性问题,而如果是在多线程环境中,如果一个线程正在执行malloc,而此时os进行了调度,使另外一个线程运行,而第二个线程也执行malloc。我感觉这两个问题性质差不多吧?
再有一个问题,就是,现在已经确定glibc中malloc是线程安全的了,也就是说malloc应该属于原子操作,而在信号处理中呢?malloc还是不可重入的吧?如果malloc在信号处理环境中也是安全的,那岂不是malloc执行时要屏蔽信号?
呵呵,不知我说的对不对,望大家指正。

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


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

我曾经自己实现了个线程安全的strtok,不过是仿照strtok代码写的,只不过把静态变量记录的位置做为参数传到函数中~~~

论坛徽章:
0
34 [报告]
发表于 2007-05-29 22:57 |只看该作者
一些系统的 strtok() 甚至是在 strtok_r() 的基础上编写完成的。

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

呵呵,收了先~~
可重入和线程安全这两个概念我还是分的不是太明了。
APUE中说malloc可能被信号中断,从而导致重入性问题,而如果是在多线程环境中,如果一个线程正在执行malloc,而此时os进行了调度,使另外 ...


显然,用一把锁能避免多线程的问题,比如要malloc就上锁。
但是加锁对付可重入,可想而知。
我没有在信号处理函数中使用malloc,很少考虑这个问题。不过确实是个问题呀,我现在也不知道我的系统是不是线程安全的
没看见man有说这个。手册还是1993的。真老。

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


显然,用一把锁能避免多线程的问题,比如要malloc就上锁。
但是加锁对付可重入,可想而知。
我没有在信号处理函数中使用malloc,很少考虑这个问题。不过确实是个问题呀,我现在也不知道我的系统是不是线程安 ...

从man中没找到答案,我只能去看代码了  呵呵~~~
感觉多线程实在是陷阱多多,稍不注意就会掉进去~~

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

从man中没找到答案,我只能去看代码了  呵呵~~~
感觉多线程实在是陷阱多多,稍不注意就会掉进去~~


简单就是美呀,不知道你malloc使用的频率和size大小如何?

论坛徽章:
0
38 [报告]
发表于 2007-05-29 23:16 |只看该作者
看代码其实暂时还不用,大概就是加锁(因为它不阻塞,所以也无妨吧?)或者尽量用局部变量,但是应该还是要锁的。

论坛徽章:
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
39 [报告]
发表于 2007-05-29 23:18 |只看该作者
原帖由 cugb_cat 于 2007-5-29 22:47 发表
可重入和线程安全这两个概念我还是分的不是太明了。
APUE中说malloc可能被信号中断,从而导致重入性问题,

这个类似于递归调用,也即某函数执行到一半时被信号打断,而在信号处理函数中又调用了此函数。如果此函数会修改一些静态变量的话,这种调用可能会导致问题。
而如果是在多线程环境中,如果一个线程正在执行malloc,而此时os进行了调度,使另外一个线程运行,而第二个线程也执行malloc。我感觉这两个问题性质差不多吧?

对头,都是在执行到一半时被打断,而且在另外的执行序列(thread)中会调用同一个函数。但线程还有另外一个问题,即多个线程同时执行某个函数,如果这个函数要修改某个共享变量,例如说一个全局变量,那么这种并发执行也是有问题的。
再有一个问题,就是,现在已经确定glibc中malloc是线程安全的了,也就是说malloc应该属于原子操作,

怎么从线程安全就“也就是”到了原子操作?
而在信号处理中呢?malloc还是不可重入的吧?如果malloc在信号处理环境中也是安全的,那岂不是malloc执行时要屏蔽信号?

线程安全和在信号处理函数中安全是不同的。

其实说来说去,只要能保证数据和状态的一致,同时避免死锁就可以了

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

呵呵,收了先~~
可重入和线程安全这两个概念我还是分的不是太明了。
APUE中说malloc可能被信号中断,从而导致重入性问题,而如果是在多线程环境中,如果一个线程正在执行malloc,而此时os进行了调度,使另外 ...


感觉thread safety版本的malloc如果是加锁处理了的,
那么,在一个函数调用malloc的时候,
如果现在发生了信号中断,
而信号处理程序中又调用了malloc
这样会造成死锁吧

可能是用的非阻塞式的

[ 本帖最后由 ypxing 于 2007-5-29 23:22 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP