?? thread_clean.c
字號:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
/*線程清理函數*/
void *clean(void *arg)
{
printf("cleanup :%s\n",(char *)arg);
return (void *)0;
}
/*線程1的執行函數*/
void *thr_fn1(void *arg)
{
printf("thread 1 start \n");
/*將線程清理函數壓入清除棧兩次*/
pthread_cleanup_push( (void*)clean,"thread 1 first handler");
pthread_cleanup_push( (void*)clean,"thread 1 second hadler");
printf("thread 1 push complete \n");
if(arg)
{
return((void *)1); //線程運行到這里會結束,后面的代碼不會被運行。由于是用return退出,所以不會執行線程清理函數。
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void *)1;
}
/*線程2的執行函數*/
void *thr_fn2(void *arg)
{
printf("thread 2 start \n");
/*將線程清理函數壓入清除棧兩次*/
pthread_cleanup_push( (void*)clean,"thread 2 first handler");
pthread_cleanup_push( (void*)clean,"thread 2 second handler");
printf("thread 2 push complete \n");
if(arg)
{
pthread_exit((void *)2);//線程運行到這里會結束,后面的代碼不會被運行。由于是用pthread_exit退出,所以會執行線程清理函數。執行的順序是先壓進棧的后執行,即后進先出。
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_exit((void *)2);
}
int main(void)
{
int err;
pthread_t tid1,tid2;
void *tret;
/*創建線程1并執行線程執行函數*/
err=pthread_create(&tid1,NULL,thr_fn1,(void *)1);
if(err!=0)
{
printf("error .... \n");
return -1;
}
/*創建線程2并執行線程執行函數*/
err=pthread_create(&tid2,NULL,thr_fn2,(void *)1);
if(err!=0)
{
printf("error .... \n");
return -1;
}
/*阻塞等待線程1退出,并獲取線程1的返回值*/
err=pthread_join(tid1,&tret);
if(err!=0)
{
printf("error .... \n");
return -1;
}
printf("thread 1 exit code %d \n",(int)tret);
/*阻塞等待線程2退出,并獲取線程2的返回值*/
err=pthread_join(tid2,&tret);
if(err!=0)
{
printf("error .... ");
return -1;
}
printf("thread 2 exit code %d \n",(int)tret);
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -