6.2、线程控制的相关函数

旧城冷巷雨未停 提交于 2020-02-02 03:44:37

1、pthread_create函数

创建一个新线程。作用,对应进程中fork() 函数。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
返回值:成功:0;失败:错误号	-----Linux环境下,所有线程特点,失败均直接返回错误号。
参数:	
	pthread_t:当前Linux中可理解为:typedef  unsigned long int  pthread_t;
	参数1:传出参数,保存系统为我们分配好的线程ID
	参数2:通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。
	参数3:函数指针,指向线程主函数(线程体),该函数运行结束,则线程结束。
	参数4:线程主函数执行期间所使用的参数。

attr参数表示线程属性,暂不讨论线程属性,先传NULL给attr参数,表示线程属性取缺省值,可参考APUE。

2、pthread_exit函数

将单个线程退出
	void pthread_exit(void *retval);	
	参数:retval表示线程退出状态,通常传NULL
	
	线程中,禁止使用exit函数,会导致进程内所有线程全部退出。
	另注意,pthread_exit或者return返回的指针所指向的内存单元
必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,
因为当其它线程得到这个返回指针时线程函数已经退出了。

3、pthread_join函数

阻塞等待线程退出,获取线程退出状态		其作用,对应进程中 waitpid() 函数。
	int pthread_join(pthread_t thread, void **retval); 
	返回值:成功:0;失败:错误号
	参数:thread:线程ID (【注意】:不是指针);retval:存储线程结束状态。

注意:
调用该函数的线程将挂起等待,直到id为thread的线程终止。thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:
1.如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返回值。
2.如果thread线程被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存放的是常数PTHREAD_CANCELED。
3.如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给pthread_exit的参数。
4.如果对thread线程的终止状态不感兴趣,可以传NULL给retval参数。

4、pthread_detach函数

实现线程分离
	int pthread_detach(pthread_t thread);	
	返回值:成功:0;失败:错误号
	线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。
	进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。
	也可使用 pthread_create函数参2(线程属性)来设置线程分离。

5、注意pthread_join和pthread_detach这两个函数不能一起使用

	原因:一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!