- 论坛徽章:
- 0
|
apue第二版P296程序清单11-4,代码在最下方。
将这段代码分别写在11-4.c和11-4.cpp中后
gcc 11-4.c -o prg1 -pthread
g++ 11-4.cpp -o prg2 -pthread
执行./prg1的输出是
thread 1 start
thread 1 push complete
thread 1 exit code 1
thread 2 start
thread 2 push complete
cleanup: thread 2 second handler
cleanup: thread 2 first handler
thread 2 exit code 2
与书中阐述的,“线程如果是通过启动例程返回而终止后,清理处理程序不会被调用”,这个说法一致
而执行./prg2的输出是
thread 1 start
thread 1 push complete
cleanup: thread 1 second handler
cleanup: thread 1 first handler
thread 1 exit code 1
thread 2 start
thread 2 push complete
cleanup: thread 2 second handler
cleanup: thread 2 first handler
thread 2 exit code 2
无论是线程调用pthread_exit退出或者是从启动例程返回,都执行了清理处理程序。
想请教下,造成这结果的原因是什么??我试过生成汇编文件后对比,有不少地方是不一致的,
不过小菜汇编实在菜,看不懂。。求助下~
#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 str1[] = "thread 1 first handler";
char str2[] = "thread 1 second handler";
pthread_cleanup_push(cleanup, str1);
pthread_cleanup_push(cleanup, str2);
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 str1[] = "thread 2 first handler";
char str2[] = "thread 2 second handler";
pthread_cleanup_push(cleanup, str1);
pthread_cleanup_push(cleanup, str2);
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() {
pthread_t tid1, tid2;
void *tret;
pthread_create(&tid1, NULL, thr_fn1, (void *)1);
sleep(1);
pthread_create(&tid2, NULL, thr_fn2, (void *)2);
pthread_join(tid1, &tret);
printf("thread 1 exit code %d\n", (int)tret);
pthread_join(tid2, &tret);
printf("thread 2 exit code %d\n", (int)tret);
exit(0);
}
|
|