1 pthread_create
pthread_create
是(Unix、Linux、Mac OS X)等操作系统的创建线程的函数。它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。
函数原型声明:
#include <pthread.h>
int pthread_create(
pthread_t *restrict tidp, //指向新创建线程标识符的指针
const pthread_attr_t *restrict attr,//设置线程属性,默认为NULL
void *(*start_rtn)(void *), //线程运行函数的起始地址
void *restrict arg //运行函数的参数结构,默认为NULL
);
//成功,返回0;出错,返回错误码。
传递参数注意的问题:
问题:
避免直接在传递的参数中传递发生改变的量,否则会导致结果不可测。
即使是只再创造一个单线程,也可能在线程未获取传递参数时,线程获取的变量值已经被主线程进行了修改。通常解决方案:
重新申请一块内存,存入需要传递的参数,再将这个地址作为arg传入。
2 使用注意事项
- 配套使用pthread_join函数
在默认情况下通过pthread_create
函数创建的线程是非分离属性的,由pthread_create函数的第二个参数决定,在非分离的情况下,当一个线程结束的时候,它所占用的系统资源并没有完全真正的释放,也没有真正终止。此时只有在pthread_join
函数返回时,该线程才会释放自己的资源。
pthread_join()
函数会一直阻塞调用线程,直到指定的线程终止。当pthread_join()
返回之后,应用程序可回收与已终止线程关联的任何数据存储空间。
但是,同时需要注意,一定要和上面创建的某一线程配套使用,这样还可以起到互斥的作用。否则多线程可能抢占CPU资源,导致运行结果不确定。
- 设置线程是detached(分离属性的)
还可以在线程创建时或者在 thread function 中调用中将其设置其为分离属性(第二个参数设定),这样一个线程结束会立即释放它所占用的资源。
附
pthread_join()函数原型
int pthread_join(
pthread_t tid, //需要等待的线程,指定的线程必须位于当前的进程中,而且不得是分离线程
void **status //线程tid所执行的函数返回值(返回值地址需要保证有效),其中status可以为NULL
);
pthread
非linux
系统的默认库, 需手动链接-线程库 -lpthread
返回值:
调用成功返回0.ESRCH
描述: 没有找到与给定的线程ID 相对应的线程。(如果多个线程等待同一个线程终止,则所有等待线程将一直等到目标线程终止。然后一个等待线程成功返回。其余的等待线程将失败返回ESRCH错误)EDEADLK
描述: 将出现死锁,如一个线程等待其本身,或者线程A和线程B 互相等待。EINVAL
描述: 与给定的线程ID相对应的线程是分离线程。
更多详细程序见:多线程之pthread_create()函数
更多对pthread_create参数的解析见:多线程pthread_create的参数
对线程创建个数的探讨参考:linux——pthread_create()到底可以创建多少个线程?