笔记十:线程间的通信(pthread_exit()和pthread_join())
2017-03-09 11:35
423 查看
linux高级编程之线程间的通信(pthread_exit()和pthread_join())
1.线程终止
如果进程中的任一线程调用了exit、_Exit或者_exit,那么整个进程就会终止。与此类似,如果信号的默认动作是终止进程,那么,把该信号发送到线程会终止整个进程。
单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。
●线程只是从启动例程中返回,返回值是线程的退出码。
●线程可以被同一进程中的其他线程取消
●线程调用pthread_exit()
pthread_exit()函数
头文件:#include <pthread.h>
函数原型:void pthread_exit(void *rval_ptr);
rval_ptr:是一个无类型指针,与传给启动例程的单个参数类似进程中的其他线程可以通过调用pthread_join()函数访问到这个指针。
pthread_join()函数
头文件:#include <pthread.h>
函数原型:int pthread_join(pthread_t thread,void **rval_ptr);
thread:线程描述符
返回值:若成功为0,否则返回错误编码
功能:调用线程将一直阻塞,直到指定的线程调用pthread_exit,从启动例程中返回或者被取消,如果线程只是从它的启动例程返回,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED.
● 我们可以通过调用pthread_join自动把线程至于分离状态,这样资源就可以恢复,如果线程已经处于分离状态,pthread_join调用就会失败,返回EINVAL。
● 如果对线程的返回值并不感兴趣,可以把rval_ptr置为NULL,在这种情况下,调用pthread_join函数将等待指定线程终止,但并不获取线程的终止状态。
接下来是关于使用pthread_exit()和pthread_join()函数的简单例子
![](http://img.blog.csdn.net/20170309113349425?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9uZ2JlaTkwMjk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看出,当一个线程通过调用pthread_exit退出或者简单的从启动例程中返回时,进程中的其他线程可以通过调用pthread_join函数获得该线程的退出状态。另外也能看出,我执行了两次,从打印信息看出,线程运行是不分先后的,可能线程1先运行,也可能线程2先运行。
注意:pthread_create()和pthread_exit()函数的无类型指针参数能传递的数值可以不止一个,该指针可以传递包含更复杂信息的结构的地址,但是注意这个结构所使用的内存在调用者完成调用以后必须仍然是有效的,否则就会出现无效或者非法内存访问。
1.线程终止
如果进程中的任一线程调用了exit、_Exit或者_exit,那么整个进程就会终止。与此类似,如果信号的默认动作是终止进程,那么,把该信号发送到线程会终止整个进程。
单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。
●线程只是从启动例程中返回,返回值是线程的退出码。
●线程可以被同一进程中的其他线程取消
●线程调用pthread_exit()
pthread_exit()函数
头文件:#include <pthread.h>
函数原型:void pthread_exit(void *rval_ptr);
rval_ptr:是一个无类型指针,与传给启动例程的单个参数类似进程中的其他线程可以通过调用pthread_join()函数访问到这个指针。
pthread_join()函数
头文件:#include <pthread.h>
函数原型:int pthread_join(pthread_t thread,void **rval_ptr);
thread:线程描述符
返回值:若成功为0,否则返回错误编码
功能:调用线程将一直阻塞,直到指定的线程调用pthread_exit,从启动例程中返回或者被取消,如果线程只是从它的启动例程返回,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED.
● 我们可以通过调用pthread_join自动把线程至于分离状态,这样资源就可以恢复,如果线程已经处于分离状态,pthread_join调用就会失败,返回EINVAL。
● 如果对线程的返回值并不感兴趣,可以把rval_ptr置为NULL,在这种情况下,调用pthread_join函数将等待指定线程终止,但并不获取线程的终止状态。
接下来是关于使用pthread_exit()和pthread_join()函数的简单例子
#include <stdio.h> #include <pthread.h> void error(char *s) { printf("%s",s); } void *fun1(void *arg) { printf("thread 1 returning\n"); return (void *)1; } void *fun2(void *arg) { printf("thread 2 returning\n"); pthread_exit((void *)2); } int main() { int err; pthread_t tid1,tid2; void *tret; err = pthread_create(&tid1,NULL,fun1,NULL); if(err != 0) { error("create thread 1 failure\n"); return -1; } err = pthread_create(&tid2,NULL,fun2,NULL); if(err != 0) { error("create thread 2 failure\n"); return -2; } err = pthread_join(tid1,&tret); pthread_cancel(tid1); if(err != 0) error("can't join with thread 1\n"); printf("thread 1 exit code %d\n",tret); err = pthread_join(tid2,&tret); if(err != 0) error("can't join with thread 2\n"); printf("thread 2 exit code %d\n",tret); return 0; }运行结果如下:
可以看出,当一个线程通过调用pthread_exit退出或者简单的从启动例程中返回时,进程中的其他线程可以通过调用pthread_join函数获得该线程的退出状态。另外也能看出,我执行了两次,从打印信息看出,线程运行是不分先后的,可能线程1先运行,也可能线程2先运行。
注意:pthread_create()和pthread_exit()函数的无类型指针参数能传递的数值可以不止一个,该指针可以传递包含更复杂信息的结构的地址,但是注意这个结构所使用的内存在调用者完成调用以后必须仍然是有效的,否则就会出现无效或者非法内存访问。
相关文章推荐
- POSIX线程,线程的客户/服务通信(pthread_join,pthread_exit,pthread_detach,pthread_self)
- 线程终止thread_exit,pthread_cancel,pthread_join
- 线程原语:pthread_create(),pthread_self(),pthread_exit(),pthread_join(),pthread_cancel(),pthread_detach(
- linux posix 通过pthread_join获取线程pthread_exit返回的数据
- 线程相关函数(1)-pthread_create(), pthread_join(), pthread_exit(), pthread_cancel() 创建取消线程
- linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结
- 2线程原语:pthread_create(),pthread_self(),pthread_exit(),pthread_join(),pthread_cancel(),pthread_detach(
- 线程pthread_create()、pthread_exit()、pthread_join()、pthread_cancel()
- 线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset
- linux 线程等待与退出 pthread_join pthread_exit 函数
- 笔记九:线程间的通信(pthread_create()和pthread_self())
- 线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset
- 线程原语:pthread_create(),pthread_self(),pthread_exit(),pthread_join(),pthread_cancel(),pthread_detach(
- linux学习值十四---线程终止pthread_exit()&pthread_join()
- Linux下多线程编程__线程的创建pthread_create与退出pthread_exit,等待当前线程退出pthread_join,获取线程ID pthread_self
- 黑马程序员_day12 多线程(线程间通信,停止线程,守护线程,Join方法,优先级)
- pthread_join/pthread_exit用法实例
- 等待线程退出pthread_join
- Linux线程-pthread_join
- pthread_join函数及linux线程