Chinaunix首页 | 论坛 | 博客
  • 博客访问: 993187
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-12-08 12:19:59

Chapter 10 excerses

In , we showed a technique that's often used to set a timeout on an I/O operation using setjmp and longjmp. The following code has also been seen:

     signal(SIGALRM, sig_alrm);

     alarm(60);

     if (setjmp(env_alrm) != 0) {

         /* handle timeout */

         ...

     }

     ...

 

What else is wrong with this sequence of code?

答案:alarm被调用之后,如果进程被schedule走了,当60秒钟后,alarm信号来了,handler被调用,handler里面会调用longjmp依据env_alrm的内容,跳转到指定位置,可是此时,setjmp还没有调用,因此这个跳转就是错误的。因此,这里面存在race condition,而且是造成错误的race condition,因此在要设置一个标记,来表明当前的env_alrm是否有了有效值,在handler里面要检查一下。

 

阅读(668) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~