免费注册 查看新帖 |

Chinaunix

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

[函数] 可再入函数和不可再入函数 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2008-08-01 10:28 |只看该作者
一般在涉及多线程编程里会把函数分为3个等级
实现越高的安全等级,编程代价就越高,性能代价也会提高

第一级:线程安全
第二级:可重入
第三级:异步信号安全

一般来讲,到达可重入就很好了,只有少数场合会要求第三级

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
12 [报告]
发表于 2008-08-01 10:40 |只看该作者
原帖由 safedead 于 2008-8-1 10:28 发表
一般在涉及多线程编程里会把函数分为3个等级
实现越高的安全等级,编程代价就越高,性能代价也会提高

第一级:线程安全
第二级:可重入
第三级:异步信号安全

一般来讲,到达可重入就很好了,只有少数 ...


学习。

论坛徽章:
0
13 [报告]
发表于 2008-08-01 11:38 |只看该作者

论坛徽章:
0
14 [报告]
发表于 2008-08-01 13:09 |只看该作者
函数“不可再入”就是指函数的实现不保证函数在多线程环境下是正确的
-------------------这个定义把线程安全和可重入搞混淆了.

可重入是指信号处理而言,在单线程环境下,也有不可重入问题,

线程安全的函数不一定就可重入,我就怀疑我最近写的一个函数线程安全但是不可重入.大概如下:

pthread_mutex_t mtx;

unreentrent_func()
{
    pthread_lock(mtx);
    //Do some thing.
}

main()
{
signal(SIGINT, unreentrent_func);

while(1)
     unreentrent_func();
}

如果main 的循环里lock后,正好接收信号,信号处理函数又会再去lock,应该会死锁,除非我的mutex改成递归锁

论坛徽章:
0
15 [报告]
发表于 2008-08-01 14:05 |只看该作者
原帖由 zw2002 于 2006-11-24 13:30 发表
可再入函数是什么样的呢,怎么保正可再入的呢?

一般是这些情况的函数不可再入

1)使用静态数据
2)调用了malloc或者vfree
3)标准I/O库里边的函数

论坛徽章:
0
16 [报告]
发表于 2008-08-01 14:08 |只看该作者

回复 #15 zwylinux 的帖子

补充一下,如果静态数据是只读的,则不会影响重入.

论坛徽章:
0
17 [报告]
发表于 2008-08-01 14:14 |只看该作者
斯蒂文森的APUE上有讲的……

论坛徽章:
0
18 [报告]
发表于 2008-08-02 02:09 |只看该作者
原帖由 mu_mu8309 于 2006/11/24 12:28 发表
不好意思啊,还是不太明白,这个例子我能理解,但对不可再入的概念不太明白

是否是书翻译的有问题。 应该就是不可重入。 lz似乎理解什么是不可重入。

论坛徽章:
0
19 [报告]
发表于 2008-08-02 08:55 |只看该作者
重入就是重新进入的意思。

将函数比成房间,前门进后门出。
如果只允许一个人同时在之中, 就是不可重入的。
如果允许上一个人没有出去的时候再进来一个,就是可重入的。

至于信号和线程的区别就是允许什么种类的人的问题。比如女入可以, 男人不可以。

论坛徽章:
0
20 [报告]
发表于 2008-08-02 16:02 |只看该作者
重入是指在进入某个函数后还未返回之前,再次进入同一函数,比如同一线程中的递归,不同线程同时调用同一函数。光知道概念意义不是很大,要分析一个函数是否可重入,主要是看它是否会影响到同一资源,是否会产生竞争,如改写全局变量等
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP