/*
* cleanup.c
*
* Created on: 2011-11-22
* Author: lc
*/
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <errno.h>
/*
* pthread_cleanup_push
* pthread_cleanup_pop函数
* 为线程退出提供处理程序(函数)
*
* 函数cleanup会在以下3种情况下被调用
* 1.线程调用pthread_exit函数
* 2.线程相应pthread_cancel函数
* 3.pthread_cleanup_pop函数的参数是非0值
*
*
* 注意 pthread_cleanup_push 要和pthread_cleanup_pop函数配对使用,
* 否则程序可能编译通不过(expected declaration or statement at end of input)
*/
void cleanup(void * arg) {
fprintf(stderr, "%s thread cleanup handler invoked\n", (char *) arg);
}
void * thread1(void * arg) {
fprintf(stderr, "thread 1 start\n");
pthread_cleanup_push(cleanup,(void *)"thread 1 first");
pthread_cleanup_push(cleanup,(void *)"thread 1 second");
if(arg) {
pthread_exit((void *)1);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_exit((void *)1);
}
void * thread2(void * arg) {
fprintf(stderr,"thread 2 start\n");
pthread_cleanup_push(cleanup,(void *)"thread 2 first");
pthread_cleanup_push(cleanup,(void *)"thread 2 second");
if(arg) {
return (void *)2;
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void *)2;
}
void * thread3(void * arg) {
fprintf(stderr,"thread 3 start\n");
pthread_cleanup_push(cleanup,(void *)"thread 3 first");
pthread_cleanup_push(cleanup,(void *)"thread 3 second");
if(arg) {
return (void *)3;
}
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
return (void *)3;
}
int main(int argc, char **argv) {
int ret;
pthread_t tid1,tid2,tid3;
void *val;
ret = pthread_create(&tid1,NULL,thread1,(void *)1);
if(ret !=0) {
fprintf(stderr,"%s\n",strerror(errno));
}
ret = pthread_create(&tid2,NULL,thread2,(void*)2);
if(ret !=0) {
fprintf(stderr,"%s\n",strerror(errno));
}
ret = pthread_create(&tid3,NULL,thread3,(void *)0);
if(ret !=0) {
fprintf(stderr,"%s\n",strerror(errno));
}
ret = pthread_join(tid1,&val);
if(ret != 0) {
fprintf(stderr,"%s\n",strerror(errno));
}
fprintf(stderr,"thread1 exit with code %d\n",(int)val);
ret = pthread_join(tid2,&val);
if(ret !=0) {
fprintf(stderr,"%s\n",strerror(errno));
}
fprintf(stderr,"thread2 exit with code %d\n",(int)val);
ret = pthread_join(tid3,&val);
if(ret !=0) {
fprintf(stderr,"%s\n",strerror(errno));
}
fprintf(stderr,"thread3 exit with code %d\n",(int)val);
return 0;
}