Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> 后端开发 文章内容

pthread_join/pthread_exit的用法解析-itarticl.cc-IT技术类文章记录&分享

发布时间: 9年前后端开发 130人已围观返回

函数pthread_join用来等待一个线程的结束。函数原型为:


extern int pthread_join __P ((pthread_t __th, void **__thread_return));


第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的线程将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;


另一种方式是通过函数pthread_exit来实现。它的函数原型为:


extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));


唯一的参数是函数的返回代码,只要pthread_exit中的参数retval不是NULL,这个值将被传递给 thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。


上面说的有点乱,看不懂的看这里:


pthread_join用于等待一个线程的结束,也就是主线程中要是加了这段代码,就会在加代码的位置卡主,直到这个线程执行完毕才往下走。


pthread_exit用于强制退出一个线程(非执行完毕退出),一般用于线程内部。


结合用法:


一般都是pthread_exit在线程内退出,然后返回一个值。这个时候就跳到主线程的pthread_join了(因为一直在等你结束),这个返回值会直接送到pthread_join,实现了主与分线程的通信。


注意事项:


这个线程退出的返回值的格式是void*,无论是什么格式都要强转成void*才能返回出来主线程(pthread_exit((void*)tmp);),而这个时候pthread_join就去接这个值,我们传进去一个void*的地址也就是&(void*),传地址进去接值是接口类函数常用的做法,有同样效果的做法是引用&,但是这个做法一来值容易被误改,二来不规范,所以定义一个类型然后把地址传进去修改value。回到题目,这里返回的void*是一个指针类型,必须强转成对应的指针才能用。


举个例子,如果是char* = “mimida”;传出来的tmp,必须(char*)tmp一下。


而如果是int* a = new(3888);这种类型返回的tmp,必须*(int*)tmp一下才能用。


最重要的一点,你定义的类型和最后出来的类型一定要一致,不然很容易出现问题。也就是你定义了int*,最后强转出来的一定是*(int*)。


别void* a = (void*)10;这种诡异的格式(我就中过招),一开始是什么就转成什么!(这个规则同时也适用于线程数据里的set和get)

void thread1(chars[])

{

printf("This is a pthread1.\n");

printf("%s\n", s);

pthread_exit((void *)"the firstreturn!"); //结束线程,返回一个值

}


void thread2(chars[])

{

int *a = new(46666);

printf("This is a pthread2.\n");

printf("%s\n", s);

pthread_exit((void *)a);

}


/**************main function ****************/


int main(void)

{

pthread_t id1, id2;

void *a1, *a2;

inti, ret1, ret2;

chars1[] = "This is first thread!";

chars2[] = "This is second thread!";

ret1 = pthread_create(&id1, NULL, (void *) thread1, s1);

ret2 = pthread_create(&id2, NULL, (void *) thread2, s2);

if(ret1 != 0)

{

printf ("Create pthread1 error!\n");

exit (1);

}

pthread_join(id1, &a1);

printf("%s\n", (char *)a1);

if(ret2 != 0)

{

printf ("Create pthread2 error!\n");

exit (1);

}

printf("This is the main process.\n");

pthread_join(id2, &a2);

printf("%s\n", *(int *)a2);

return(0);

}


运行结果:

This is a pthread1.

This is first thread!

the firstreturn!

This is the main process.

This is a pthread2.

This is second thread!

46666

发布时间: 9年前后端开发130人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    129人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流