- 论坛徽章:
- 0
|
本帖最后由 davelv 于 2010-09-28 09:35 编辑
问题1、请求撤销线程,而且线程亦被撤销掉,但是注册的线程清理函数没有运行。
现有四个函数分别是,主函数,线程工作函数,线程监视函数,线程清理函数。
其中主函数负责建立工作线程和监视线程,而后为监视线程生产资源。
- int scheduler_listen(int sock)
- {
- int i ,fd ,ret;
- pthread_attr_init(&thread_attr);
- pthread_attr_setstacksize(&thread_attr, 1024*1024);
- pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
- //建立工作线程
- for (i=0; i<SCAN_THREAD_NUM; i++) {
- memset(&thread_param[i], 0x00, sizeof(THREAD_PARAM));
- thread_param[i].exec_time = -1;
- ret = pthread_create(&(thread_param[i].scan_thread), &thread_attr, loop_scanfile, (void *)&thread_param[i]);
- if (ret != 0) {
- //出错
- return -1;
- }
- }
- //建立监视线程
- pthread_t psd;
- pthread_create(&psd, &thread_attr, status_daemon, NULL);
- //block self!
- while(1)
- {
- //生产资源
- }
- puts("exit!");
- return 0;
- }
复制代码 工作线程主要是处理主函数生产的资源。
- void *loop_scanfile(void *param)
- {
- struct cancel_param cp;
- //初始化部分
-
- //注册清理函数
- pthread_cleanup_push(thread_cleanup, &cp);
- while(1) {
- //获取资源
- //处理
- }//end while(1)
- pthread_cleanup_pop(0);
- return NULL;
- }
复制代码 监视函数是为了监视工作线程是否超时,超时则请求撤销该线程,并新建一个工作线程
- void *status_daemon(void *a)
- {
- int i;
- time_t now;
- while(1)
- {
- //休眠
- sleep(5);
-
- time(&now);
- for(i=0; i<SCAN_THREAD_NUM; i++)
- { //检测超时
- if((thread_param[i].exec_time>0) && (now-thread_param[i].exec_time >config.timeout) )
- {
- printf("Scan thread timeout, restart it!\n");
- //请求撤销
- pthread_cancel(thread_param[i].scan_thread);
- //新建线程
- if ( pthread_create(&(thread_param[i].scan_thread), NULL, loop_scanfile, (void *)&thread_param[i]) != 0)
- {
- gate_print("%sScan thread recreate failed!",ERRSTR);
- exit(-1);
- }
- }
- }
- }
- return NULL;
- }
复制代码 线程清理函数主要是负责当工作线程被撤销时,回收正在使用的资源。
- void thread_cleanup(void *param)
- {
- struct cancel_param *cp = (struct cancel_param*)param;
- puts("Cleaning");
- //清理资源
- }
复制代码 在线程超时后,没有看到清理函数输出的内容,用过pstree查看进程信息,发现线程已经取消掉,但是资源未释放内存占用越来越大。这是为什么呢?
问题2、分离属性的线程运行完毕后或者撤消后,什么样的资源是由系统自动回收的?堆分配的资源系统会自动回收么?和joinable的线程在资源处理上有什么分别?看了一些资料,写都不是很详细,麻烦诸位给点详细的资料。 |
|