- 论坛徽章:
- 0
|
1可用积分
APUE2中关于线程清理处理函数时说明:如果线程是从启动例程返回的而终止的话(也就是调用return而不是pthread_exit),则线程的清理处理程序则不会被调用。
以下是一个测试的函数,但是结果却是两个线程都调用了线程清理处理函数,为什么呢?
难道线程1不是启动例程返回的吗?顺便说说什么才是从启动例程返回吧?
- #include <stdio.h>
- #include <pthread.h>
- static void cleanup(void* arg){
- printf("cleanup: %s\n", arg);
- }
- static void* thr_fn1(void* arg){//从启动例程返回
- printf("thread 1:\n");
- pthread_cleanup_push(cleanup, "thread 1 first handler\n");
- pthread_cleanup_push(cleanup, "thread 1 second handler\n");
- printf("thread 1 push complete\n");
- if(arg){
- printf("hhhhhhhhhhhhhhhhhhhhhhhh\n");
- return ((void*)1);
- }
- pthread_cleanup_pop(1);
- pthread_cleanup_pop(1);
- return ((void*)1);
- }
- static void* thr_fn2(void* arg){//用pthread_exit()返回
- printf("%s\n", (char*)arg);
- pthread_cleanup_push(cleanup, "thread 2 first handler\n");
- pthread_cleanup_push(cleanup, "thread 2 second handler\n");
- printf("thread 2 push complete\n");
- if(arg){
- printf("tttttttttttttttttttttt\n");
- pthread_exit((void*)2);
- }
- pthread_cleanup_pop(1);
- pthread_cleanup_pop(1);
- pthread_exit((void*)2);
- }
- int main(void)
- {
- int err;
- pthread_t tid1, tid2;
- void* rval;
- err = pthread_create(&tid1, NULL, thr_fn1, NULL);
- if(err != 0){
- perror("pthread_create");
- return 1;
- }
- err = pthread_create(&tid2, NULL, thr_fn2, "thread 2:");
- if(err != 0){
- perror("pthread_create");
- return 2;
- }
- err = pthread_join(tid1, (void*)&rval);
- if(err != 0){
- perror("pthread_join");
- return 3;
- }
- printf("thread 1 exiting code %d\n", (int)rval);
- err = pthread_join(tid2, (void*)&rval);
- if(err != 0){
- perror("pthread_join");
- return 4;
- }
- printf("thread 2 exiting code %d\n", (int)rval);
- return 0;
- }
复制代码
运行结果是:
thread 1:
thread 1 push complete
cleanup: thread 1 second handler
cleanup: thread 1 first handler
thread 2
thread 2 push complete
tttttttttttttttttttttt
cleanup: thread 2 second handler
cleanup: thread 2 first handler
thread 1 exiting code 1
thread 2 exiting code 2
还有一点不明白的是:程序输出cleanup之间的换行是从哪里得到的? |
|