线程退出处理函数 pthread_cleanup_push pthread_cleanup_pop

来源:互联网 发布:白银杀人案 知乎 编辑:程序博客网 时间:2024/04/30 13:02



/* * 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;}


原创粉丝点击