doing5552

记录每日点滴,不枉人生一世

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  73 Posts :: 0 Stories :: 94 Comments :: 0 Trackbacks

公告

常用链接

留言簿(24)

我参与的团队

最新随笔

搜索

  •  

积分与排名

  • 积分 - 452236
  • 排名 - 47

最新随笔

最新评论

阅读排行榜

评论排行榜

epoll_wait是线程退出点吗?
2010年04月02日 星期五 上午 10:46
在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;
}

posted on 2010-07-18 21:15 doing5552 阅读(943) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理