在线程代码中,这个特殊的执行流被称为“初始线程”或“主线程”(mian函数中的线程)。初始线程的特殊性在于main函数返回阶段保留了传统UNIX进程行为,即进程结束时不会等待其他线程结束。从main函数返回将导致进程终止,也将使进程内所有的线程终止。可以在main函数中调用pthread_exit,这样进程就必须等到所有线程结束后才能终止。
#include <pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2);//若相等则返回非0值,否则返回0 int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr,void *(*start_rtn)(void), void *restrict arg); //tidp:获取新创建线程的线程ID,attr:线程属性,start_rtn:新创建的线程从start_rtn函数的地址开始运行,arg:start_rtn的指针参数 //若成功则返回0,否则返回错误编号 void pthread_t pthread_self(void);//返回调用线程的线程ID void pthread_exit(void *rval_ptr);//rval_ptr:保存线程退出后返回的值 int pthread_join(pthread_t thread, void **rval_ptr);//若成功返回0,否则返回错误编码 int pthread_detach(pthread_t tid);//若成功返回0,否则返回错误编号 //使线程进入分离状态。分离一个正在运行的线程不会对线程带来任何影响,仅仅是通知系统当该线程结束时,其所属资源可以被回收。
- 线程创建时并不能保证哪个线程会先运行:是新创建的线程还是调用线程。新创建的线程可以访问进程的地址空间,并且继承调用线程的浮点环境和信号屏蔽字,但是该线程的未决信号集被清除。
- 一个没有被分离的线程终止时会保留其虚拟内存,包括他们的堆栈和其他系统资源。分离线程意味着通知系统不再需要此线程。允许系统将分配给它的资源回收;(避免内存泄露)
- 让线程返回某个值,即时该值为空,如果忽略返回语句,pthread_join还是会返回某个值,不论线程保存返回值的地方(可能是寄存器)保存了什么数据都会被返回
- 还可以通过信号SIGEV_THREAD创建线程
- 在当前线程从函数pthread_create中返回以及新线程被调度执行之间不存在同步关系。即,新线程可能在当前线程从pthread_create返回之前就运行了,甚至在当前线程从pthread_create返回之前,新线程就可能已经运行完毕
- 线程被回收后,线程ID无效不可再被使用。线程终止后其系统和进程资源,返回值内存空间,堆栈,寄存器状态等资源不可再被使用。如一个线程将其堆栈空间通过指针传递给另一线程,当该线程终止后,上述资源不可再用
线程属性
pthread_attr_t attr; int pthread_attr_init(pthread_attr_t *attr);//调用成功完成后将返回零,其它返回值表示出错 int pthread_attr_destroy(pthread_attr_t *tattr);//调用成功完成后将返回零,其它返回值表示出错 //设置/获取分离状态 int pthread_attr_setdetachstate(pthread_attr_t *tattr,int* detachstate);//调用成功完成后将返回零,其它返回值表示出错 int pthread_attr_getdetachstate(const pthread_attr_t *tattr, int *detachstate);//调用成功完成后将返回零,其它返回值表示出错 //设置/获取栈溢出保护区大小 int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize); int pthread_attr_getguardsize(const pthread_attr_t *attr,size_t *guardsize); //设置/获取线程并行级别 int pthread_setconcurrency(int new_level); int pthread_getconcurrency(void); //设置/获取栈大小 int pthread_attr_setstacksize(pthread_attr_t *tattr, size_t size);//调用成功完成后将返回零,其它返回值表示出错 int pthread_attr_getstacksize(pthread_attr_t *tattr, size_t *size);//调用成功完成后将返回零,其它返回值表示出
- 线程默认的连接属性是PTHREAD_CREATE_JOINABLE
- 线程堆栈大小不可移植,PTHREAD_STACK_MIN指定线程栈最小大小,从上向下的地址空间指定的地址是栈的最高地址而不是最低地址,如果增大栈需指定最低地址。该属性移植性不好