高手进,关于pthread_cleanup_push的问题
有哪位大侠能整理一下pthread_cleanup_push指定函数不被执行的诸多情况。
目前遇到这样一问题,起一线程,在线程函数最开始加了一个pthread_cleanup_push(freemylock,NULL);在函数结束的地方加了一个pthread_cleanup_pop(0);线程函数又调了其他的函数,用pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);将线程设置成可以取消。此时在线程结束之前我在主线程里pthread_cancel(pthreadid),这时候子线程被中止了,可是我设置的清理函数freemylock()却没被执行。哪位大侠能帮帮我呀,我写的一个测试程序和我实际的程序逻辑是一样的可以执行清理函数,测试程序如下:
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
void inf_lop2()
{
int w = 0;
while(++w)
{
printf("ddddddddddddddddddddddd\n");
if(w>10000)
{
break;
}
}
}
void inf_loop()
{
int i =0;
while (1)
{
i++ ;
inf_lop2();
// printf("i is %d\n",i);
// sleep(1);
// printf("mmmmmmmmmmmmmmmmmmmmmmmm\n");
}
printf("%d", i);
}
void cleanup(void* arg){
printf("cleanup: wwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n");
}
void* thr_fn1(void* arg){
printf("thread1 starte\n");
pthread_cleanup_push(cleanup, NULL);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);
printf("thread 1 push complete \n");
while(1)
{
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);
printf("11111111111111111111111111\n");
inf_loop();
printf("222222222222222222222222222222\n");
pthread_testcancel();
printf("33333333333333333333\n");
}
pthread_cleanup_pop(0);
return ((void*) 1);
}
int main(void){
int err;
pthread_t tid1, tid2;
void *tret;
err = pthread_create(&tid1, NULL, thr_fn1, (void*) 1);
getchar();
printf("thread 1 exit code %d\n", (int)tret);
pthread_cancel(tid1);
printf("11111111111\n");
pthread_join(tid1,NULL);
printf("qqqqqqqqqqqqq\n");
sleep(3);
printf("############################\n");
printf("thread 2 exit code %d\n", (int)tret);
getchar();
return 0;
}
可在我的工程里就是不执行,到底怎么回事?由于工程太大无法贴出代码望大侠原谅。不知我说明白了没