- 论坛徽章:
- 0
|
关于 pthread_cleanup_push 有如下描述:
================================
从pthread_cleanup_push()的调用点到pthread_cleanup_pop()之间的程序段中的终止动作
(包括调用pthread_exit()和取消点终止)都将执行pthread_cleanup_push()所指定的清理函数。
================================
请问其中的“取消点终止”是什么意思?
我尝试了以下的 pthread_cancel(),但并不会触发 clean(),这是为什么?
以下是代码:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
void clean(void* p)
{
printf("clean()\n");
}
void* thread(void* p)
{
pthread_cleanup_push(clean, NULL);
//===============================
printf("thread sleep\n");
sleep(10);
printf("thread wake...\n");
//===============================
pthread_cleanup_pop(1);
}
int main()
{
pthread_t id;
pthread_create(&id, NULL, thread, NULL);
printf("main sleep\n");
sleep(3);
printf("cancel thread: %u\n", id);
pthread_cancel(id);
return 0;
}
==========================
输出:
thread sleep
main sleep
cancel thread: 3085872016
==========================
在 xxx_push() 和 xxx_pop() 之间唯有调用 pthread_exit() 会触发 clean() 函数,
return 也不会,(异常没有试过, 还不会手动抛出异常);
这是一个老问题了,也看到别人问过(比如: http://bbs.chinaunix.net/viewthread.php?tid=456153)
但在网上一直没有找到正式的回答; |
|