文中先讲解函数,再运行实例,以及一些注意事项。
一、使用pthread创建一个子线程并传入参数
函数pthread_create
,使用man 3 pthread_create
查看介绍。
1.1 函数基本用法讲解
1.1.1 pthread_create
#include <pthread.h> /*在当前进程中创建一个新的线程,新线程的运行会调用start_routine函数,同时传递arg参数给 *start_routine函数 */ int pthread_create(pthread_t *thread, //新线程句柄 const pthread_attr_t *attr,//新线程的属性 void *(*start_routine) (void *), //新线程调用的函数 void *arg);//传递给新线程的参数
函数描述:
通过pthread_create
创建的新线程,有收下四种方法退出线程:
- 调用
pthread_exit(value)
,value是退出状态值,该值对同进程中调用了pthread_join()
的线程是可见的; - 从
start_routine
返回,在该函数中调用return
语句 - 线程被cancel,参见
pthread_cancel()
- 任何线程调用了
exit
方法,或者主线程在main
函数中返回,都会导致所有线程的退出。
attr参数
是一个pthread_attr_t
结构体,它在线程被创建时被用来设定新线程的属性。这个结构体的初始化是通过pthread_attr_init()
函数。如果该参数为空,那么新线程会使用默认的属性参数。
在pthread_create
函数调用返回之前,新线程的内存指针会赋给thread
参数,表示线程的ID,这个ID的作用是在后续可以调用针对该线程的其它pthreads函数。
返回值
成功返回0,失败返回一个错误编号,同时thread
参数也不会被赋值。
pthread_join
函数描述
#include <pthread.h> int pthread_join(pthread_t thread, void **retval);
pthread_join
函数会等待指定的线程结束,如果指定的线程已经线束,那么它会立即返回。指定的线程必须是joinable的。也就是说,pthread_join()
函数会一直阻塞调用线程,直到指定的线程tid终止。当pthread_join()
返回之后,应用程序可回收与已终止线程关联的任何数据存储空间,(另外也可设置线程attr属性,当线程结束时直接回收资源)如果没有必要等待特定的线程终止之后才进行其他处理,则应当将该线程分离pthread_detach()
。
如果retval
不为空,那么该函数会拷贝退出状态值到retval
指向的内存中,如果目标thread被cancel了,retval
的值为PTHREAD_CANCELED
返回值
成功返回0,错误返回错误码