LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1318|回复: 2

线程取消点的困惑

[复制链接]
发表于 2006-3-16 17:57:22 | 显示全部楼层 |阅读模式
在一本书上看到这样一段关于线程取消点的描述:
线程取消的方法是向目标线程发Cancel信号,但如何处理Cancel信号则由目标线程自己决定,或者忽略、或者立即终止、或者继续运行至Cancelation-point(取消点),由不同的Cancelation状态决定。
线程接收到CANCEL信号的缺省处理(即pthread_create()创建线程的缺省状态)是继续运行至取消点,也就是说设置一个CANCELED状态,线程继续运行,只有运行至Cancelation-point的时候才会退出。

2.3 取消点
根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及read()、write()等会引起阻塞的系统调用都是Cancelation-point,而其他pthread函数都不会引起Cancelation动作。但是pthread_cancel的手册页声称,由于LinuxThread库与C库结合得不好,因而目前C库函数都不是Cancelation-point;但CANCEL信号会使线程从阻塞的系统调用中退出,并置EINTR错误码,因此可以在需要作为Cancelation-point的系统调用前后调用pthread_testcancel(),从而达到POSIX标准所要求的目标,即如下代码段:
pthread_testcancel();
retcode = read(fd, buffer, length);
pthread_testcancel();

我不明白为什么可以在需要作为Cancelation-point的系统调用前后调用pthread_testcancel(),就可以达到POSIX标准所要求的目标,我还是不太理解取消点的内涵,
pthread_testcancel();
retcode = read(fd, buffer, length);
pthread_testcancel();
加两个pthread_testcancel(); 是干什么的?是不是线程运行到retcode = read(fd, buffer, length); 线程就终止
发表于 2006-3-18 11:29:45 | 显示全部楼层
看了man后,我的理解:Cancelation-point的意义是,当一个线程收到一个cancel信号时,目标线程或者执行到Cancelation-point,并进行相关操作。 如果目标线程没有阻塞,则执行到Cancelation-point;如果目标线程已经阻塞,则唤醒目标线程,然后再执行相关操作。所以会有两个pthread_testcancel
回复 支持 反对

使用道具 举报

发表于 2006-4-8 11:25:15 | 显示全部楼层

Re:线程取消点的困惑

我谈一下个人的理解哈。
   首先,Cancelation-point并不能单纯的理解成一个“点”,可以理解成一个时间段。posix规定:read函数应该是一个Cancelation-point,就是说:从read开始执行到read返回,当前线程都可以执行Cancelation操作。当前线程可能在read之前就收到了cancel信号,也可能在read的执行过程中收到了cancel信号。linux不支持read等函数成为一个Cancelation-point,为了我们在linux下开发的代码可以满足posix标准,做如下处理:
    pthread_testcancel();
      retcode = read(fd, buffer, length);
      pthread_testcancel();
      前面一个pthread_testcancel是为了响应当前线程在read之前收到的cancel信号,后面一个pthread_testcancel是为了响应当前线程在read的执行过程中收到的cancel信号(cancel信号使得线程从阻塞的系统调用read中退出),这样我们就实现了posix标准的要求。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表