- 论坛徽章:
- 0
|
- #include"apue.h"
- #include<pthread.h>
- void cleanup(void *arg)
- {
- printf("cleanup:%s\n",(char*)arg);
- }
- void *thr_fn1(void *arg)
- {
- printf("thread 1 start\n");
- char *th1,*th2;
- th1="thread 1 first handler";
- th2="thread 1 second handler";
- pthread_cleanup_push(cleanup,th1);
- pthread_cleanup_push(cleanup,th2);
- printf("thread 1 push complete\n");
- if(arg)
- return((void*)1);
- pthread_cleanup_pop(0);
- pthread_cleanup_pop(0);
- return((void*)1);
- }
- void *thr_fn2(void *arg)
- {
- printf("thread 2 start\n");
- char *th1,*th2;
- th1="thread 2 first handler";
- th2="thread 2 second handler";
- pthread_cleanup_push(cleanup,th1);
- pthread_cleanup_push(cleanup,th2);
- printf("thread 2 push complete\n");
- if(arg)
- pthread_exit((void*)2);
- pthread_cleanup_pop(0);
- pthread_cleanup_pop(0);
- pthread_exit((void*)2);
- }
- int main(void)
- {
- int err;
- pthread_t tid1,tid2;
- void *tret;
- err=pthread_create(&tid1,NULL,thr_fn1,(void*)1);
- if(err!=0)
- printf("can't");
- err=pthread_create(&tid2,NULL,thr_fn2,(void*)1);
- if(err!=0)
- printf("can't");
- err=pthread_join(tid1,&tret);
- if(err!=0)
- printf("can't");
- printf("pthread 1 exit code %d\n",(int)tret);
- err=pthread_join(tid2,&tret);
- if(err!=0)
- printf("can't");
- printf("pthread 2 exit code %d\n",(int)tret);
- exit(0);
复制代码 该代码是apue11-4 线程清理处理程序,书上给出的运行结果是:
thread 1 start
thread 1push complete
thread 2 start
thread 2 push complete
cleanup: thread 2 second handler
cleanup: thread 2 first handler
thread 1exit code 1
thread 2exit code 2
我在win下用cygwin模拟linux环境的运行结果是:
大家看看怎么回事.. |
|