/******************************************************************************************************************
参考:http://www.programfan.com/CLUB/showpost.asp?id=985
说明:线程的返回retrun和pthread_exit?。
******************************************************************************************************************/
其实还有除了上边这种还有一种是 异常 退出,这种要在线程中故意访问一个受系统保护的指针来验证一个。说区别干说多没有意思只有拿线程中用到的函数来找他们的区别,由于都是返回的先看看pthread_join这个函数。它俩会对会有什么不同,执行下边这个函数和把pthread_exit换成return,pthread_join接收到的值都是一样的。
#include <stdio.h> #include <pthread.h> #include <unistd.h> int a = 1; void *create(void *arg) { printf("new pthread .. \n"); printf("a = %d \n", a); pthread_exit ((void *)8); } int main(int argc, char *argv[]) { pthread_t tidp; int error; void *temp; error = pthread_create(&tidp, NULL, create, NULL); printf("main thread!\n"); if( error ) { printf("thread is not created ... \n"); return -1; } error = pthread_join(tidp, &temp); if( error ) { printf("thread is not exit .. \n"); return -2; } printf("new is exit code %d \n", (int )temp); return 0; }
[root@localhost gcc]# ./a.out main thread! new pthread .. a = 1 new is exit code 8 [root@localhost gcc]#
pthread_exit() return 都可以用pthread_join来接收返回值的:(pthread_exit ((void *) 8);改为return (void*)8;效果一样)
第二个测试就是phread_cleanup_push,在书上隐隐约约看到这个只支持 异常退出 和 pthread_exit,不理return 那就来试试了。如下程序:
#include <stdio.h> #include <pthread.h> #include <unistd.h> void *clean(void *arg) { printf("clearup: %s\n", (char*)arg); return (void*)0; } void *thr_fn1(void *arg) { printf("thread 1 start \n"); pthread_cleanup_push((void*)clean, "thread 1 first handler"); pthread_cleanup_push((void*)clean, "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((void*)clean, "thread 2 first handler"); pthread_cleanup_push((void*)clean, "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(void) { int err; pthread_t tid1, tid2; void *tret; err = pthread_create(&tid1, NULL, thr_fn1, (void *)1); if(err != 0) { printf("main1:error...\n"); return -1; } err = pthread_create(&tid2, NULL, thr_fn2, (void *)1); if(err != 0) { printf("main2:error...\n"); return -1; } err = pthread_join(tid1, &tret); if(err != 0) { printf("main3:error ... \n"); return -1; } printf("thread 1 exit code %d \n", (int)tret); err = pthread_join(tid2, &tret); if(err != 0) { printf("main4:error ...\n"); return -1; } printf("thread 2 exit code %d \n", (int)tret); return 1; }运行结果:
[root@localhost gcc]# ./a.out thread 2 start thread 2 push complete clearup: thread 2 second handler clearup: thread 2 first handler thread 1 start thread 1 push complete thread 1 exit code 1 thread 2 exit code 2 [root@localhost gcc]#
运行结果来看就不是不支持return,异常退出的测试就要把线程改为:
void *thr_fn2(void *arg) { printf("thread 2 start \n"); pthread_cleanup_push((void*)clean, "thread 2 first handler"); pthread_cleanup_push((void*)clean, "thread 2 second handler"); printf("thread 2 push complete \n"); if(arg) { printf("我可能要死了。。\n"); *b = "ahahhah"; printf("我还活着!\n"); pthread_exit((void *)2); } pthread_cleanup_pop(0); pthread_cleanup_pop(0); pthread_exit((void*)2); }
[root@localhost gcc]# gcc test.c -lpthread -Wall test.c: 在函数‘thr_fn2’中: test.c:41: 警告:赋值时将指针赋给整数,未作类型转换 [root@localhost gcc]# ./a.out thread 2 start thread 2 push complete 我可能要死了。。 段错误 (core dumped) [root@localhost gcc]#从运行结果来看我看书没看仔细,异常退出是不支持的!多亏整理了blog,才能真正了解!