- 论坛徽章:
- 1
|
apue p295的代码,讲解pthread_cleanup_push和pthread_cleanup_pop的使用,有个地方不太明白,求解释一下。
代码:- #include <stdio.h>
- #include <pthread.h>
- void cleanup(void *arg)
- {
- printf("cleanup : %s \n", (char*)arg);
- }
- void *thr_fn1(void *arg)
- {
- printf("thread 1 start \n");
- pthread_cleanup_push(cleanup, const_cast<char*>("thread 1 first handler"));
- pthread_cleanup_push(cleanup, const_cast<char*>("thread 1 second handler"));
- 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");
- pthread_cleanup_push(cleanup, const_cast<char*>("thread 2 first handler"));
- pthread_cleanup_push(cleanup, const_cast<char*>("thread 2 second handler"));
- 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(int argc, char **argv)
- {
- pthread_t tid1, tid2;
- void *tret;
- pthread_create(&tid1, NULL, thr_fn1, (void*)1);
- pthread_create(&tid2, NULL, thr_fn2, (void*)1);
- pthread_join(tid1, &tret);
- printf("thread 1 exit code %ld\n", (long)tret);
- pthread_join(tid2, &tret);
- printf("thread 2 exit code %ld\n", (long)tret);
- return 0;
- }
复制代码 有些不太明白的地方是:
1、书上说了,如果以0调用pthread_cleanup_push,则清理函数不会被调用,且不论以什么方式调用,pthread_cleanup_pop都会删除上次pthread_cleanup_push调用建立的清理函数。
|
|