当前位置:  技术问答>linux和unix

关于pthread_testcancel的疑问

    来源: 互联网  发布时间:2016-10-28

    本文导语:  本帖最后由 laoshizhuce 于 2010-11-25 14:39:16 编辑 关于pthread_testcancel APUE有这样一段话 根据POSIX标准,pthread_join()、pthread_testcancel()、pthread_cond_wait()、 pthread_cond_timedwait()、sem_wait()、sigwait()等函数以及read()、write()等会引起...

本帖最后由 laoshizhuce 于 2010-11-25 14:39:16 编辑
关于pthread_testcancel APUE有这样一段话

根据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();


我的疑问是
1.read()等系统调用不是有Cancelation-point不,那为什么还要pthread_testcancel,
  pthread_testcancel 到底是起什么作用的

2.这里为什么read前后都要用pthread_testcancel 

谢谢

|
没有做过实验,说说自己的理解
POSIX确实要求read等函数要实现cancelation point功能,但是目前这个功能没有实现
pthread_testcancel在这里的用途是手工添加一个cancelation point,也就是说你自己实现了cancelation point的功能
read前为什么要添加,这是因为read可能长时间阻塞,在这之前应该首先检查线程是否被cancel了,以免线程已经被cancel但是长时间无法退出。read后添加是因为线程如果阻塞在read时收到了cancel信号,read会被中断并返回,所以这个时候检查一下是否确实收到了这个信号,还是收到了其它信号(或函数正常返回或出现了其它错误)
建议lz自己测试一下read是否有实现cancelation point

|
你好,兄弟,这个帖子里面你说的我理解了http://topic.csdn.net/u/20101127/12/19d9424c-e481-40e1-995d-4d04e8b48dbd.html?72381  再看看我3楼的提问 麻烦了 大哥

|
我也遇到这样的问题,LZ找到给我说一下

|
我试了printf(),这个函数是支持cancelation-point的,不过有点不是很明白。请看下面代码:
void *thread1(void *arg)
{
         printf("start thread (%u)n", (unsigned)pthread_self());
 sleep(3);
         printf("thread (%u) endn", (unsigned)pthread_self());
}
int main(int arg,char *argv[])
{
int ret;
pthread_t t1;
printf("main start:n");
ret = pthread_create(&t1,NULL,thread1,NULL);
pthread_cancel(t1);
//pthread_join(t1,NULL);
sleep(3);
printf("a=%dn",a);
return 0;
}
在thread1后加入sleep就只打印startthread,但是不加sleep就两个printf都打印,求解。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在调用pthread_testcancel时要采用这样的方式???


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,