免费注册 查看新帖 |

Chinaunix

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

[求助]关于可重入,线程安全,异步信号安全的疑问 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-01-13 15:59 |只看该作者
cjaizss 发表于 2012-01-13 09:47

所谓非线程安全,是指函数中临时用到公共的存储,又没加信号量等东西来保护临界.
只用局部变量或者使用公共变量的时候加临界保护,是线程安全的.
而使用全局变量显然是无法重入的
其实可以这样考虑,把信号中断也当成一个线程,只是它比普通线程少了一个非常重要的特点:调度,所以如果用信号量等来同步,可能会死在那里.
可重入必然线程安全
程序:
sem(on);
.....
信号来了
....
sem(off);
信号处理
sem(on);//永远挂在这里
....
sem(off);


谢谢斑竹热心讲解!

论坛徽章:
0
12 [报告]
发表于 2012-04-14 12:35 |只看该作者
回复 1# 聪聪知不道


    谁能给出严格的数学证明,证明可重入一定是线程安全的?

论坛徽章:
0
13 [报告]
发表于 2012-08-19 11:01 |只看该作者
回复 9# cjaizss


    你好,可重入的一定是线程安全的吗?在wiki里看到这一段:http://zh.wikipedia.org/wiki/%E5 ... 4.E5.85.B3.E7.B3.BB  。 觉得它说的有些道理,但是又有很多地方说可重入一定是安全的,请问到底该相信哪个?

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
14 [报告]
发表于 2012-08-19 17:08 |只看该作者
wiki的例子有问题,明明前边已经说明过了,可重入的函数,不能调用非可重入的函数。却拿访问文件的函数来举例子。
文件的访问是不可重入的。

一个调用了不可重入函数的函数,却被拿来当成可重入函数做非线程安全的例子。这不是自相矛盾么?


一个可重入函数是否线程安全,完全取决于你对可重入的定义。
有明确的定义,就有明确的答案。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
15 [报告]
发表于 2012-08-20 16:39 |只看该作者
英文维基有如下例子:
  1. int t;

  2. void swap(int *x, int *y)
  3. {
  4. int s;

  5. s = t; // save global variable
  6. t = *x;
  7. *x = *y;
  8. // hardware interrupt might invoke isr() here!
  9. *y = t;
  10. t = s; // restore global variable
  11. }

  12. void isr()
  13. {
  14. int x = 1, y = 2;
  15. swap(&x, &y);
  16. }
复制代码
Link:http://en.wikipedia.org/wiki/Reentrant_(subroutine)

上面的代码是可重入,但不是线程安全的。

貌似维基并没有解决我们的疑惑。我也倾向于将重入与线程安全一起讨论,而不是仅考虑递归和中断嵌套。

大家不要喷我,可以喷维基,如果维基喷不动,可以随意喷百度百科。

http://baike.baidu.com/view/2394660.htm
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP