Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336928
  • 博文数量: 32
  • 博客积分: 1470
  • 博客等级: 上尉
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-31 11:38
个人简介

实践主义者,多行路远胜于多读书。

文章分类

分类: LINUX

2007-08-29 11:52:16

在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;
}

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