免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1037 | 回复: 0
打印 上一主题 下一主题

epoll_wait是线程退出点吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-29 11:52 |只看该作者 |倒序浏览

                                在Linux上,epoll_wait是否cancellation point,取决于glibc的版本.
好像在glibc-2.4以上版本中才支持.
假如系统epoll_wait不是cancellation point,那么在某线程执行epoll_wait时,另一线程通过pthread_cancel发出cancel信号,那么表现为:
1. 在epoll_wait返回之前,线程阻塞该信号,并不响应;
2. 当epoll_wait返回时,线程立即退出(所有资源不会被释放),在此之前即使通过pthread_cleanup_push注册了销毁时的回调函数也不会被执行;同时,如果有线程阻塞在pthread_join等待此线程退出的话,则会返回.
测试代码如下:
               
               
                /*
  test epoll_wait is a cancellation point.
  glibc-2.4 or later support.
  fedora 5 support.
*/
#include sys/epoll.h>
#include pthread.h>
#include stdio.h>
#include unistd.h>
void * run (int * events) {
    struct epoll_event storage;
    printf("Wait start.\n");
    /* block forever */
    epoll_wait(*events, &storage, 1, -1/*10000*/);
    printf("Wait stop.\n");
    return NULL;
}
int main (void) {
    int events;
    pthread_t new_thread;
    events = epoll_create(1);
    pthread_create(&new_thread, NULL, (void * (*) (void *))run, &events);
   
    /* wait for enter keypress to try pthread cancellation */
    getchar();
    printf("Cleanup start.\n");
    pthread_cancel(new_thread);
    /* let's see if this returns or not */
    pthread_join(new_thread, NULL);
   
    /* if to here, the epoll_wait is a cancellation point. */
    printf("Cleanup stop.\n");
   
   
    close(events);
    return 0;
}
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/870/showart_370205.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP