定义:
线程包含了表示进程内执行环境必须的信息,其中包含进程中标识线程的:线程ID,一组寄存器值,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据。
进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本,程序的全局变量和堆内存,栈以及文件描述符。
1、线程状态
joinable:当线程退出时,它不会释放其所占用的堆栈和线程描述符,只有当父线程通过调用pthread_join(),才会释放资源;
unjoinable:当线程退出时,它自动释放所有资源;
2、设置线程unjoinable状态
a. pthread_create()执行unjoinable属性;
b. 父线程调用pthread_detach(threadid);
c. 子线程调用pthread_detach(pthread_self()),线程要退出时,调用pthread_exit()即可;
3、创建线程
int pthread_create(newThread, attrs, threadFunc, arg);
newThread--pthread_t 线程ID;
attrs--线程属性
threadFunc--线程主函数,原型为void *pthreadhandler(void *arg);
arg--传递给线程主函数的参数。
返回值:0-OK,否则错误。
注意:线程创建时并不能保证哪个线程先执行:新线程还是调用线程。新线程可以访问进程的地址空间,继承调用线程的浮点环境和信号屏蔽字,但该线程的未决信号集被清除。在信号产生和递送之间的时间间隔内,称信号是未决(pending)的
4、终止线程
如果进程的任一线程调研了exit(),_Exit,或_exit,则整个进程退出。
单个线程退出的方式:
a. 线程主函数返回,返回值是线程退出码;
b. 线程被同一进程中的其他线程取消;pthread_cancel(tid);
c. 线程调用pthread_exit();
当线程通过方式a和c退出时,进程中的其他线程可通过pthread_join(tid, &ret);获得其退出状态。
注意pthread_cancel(tid);并不等待线程退出。
线程清理处理程序
void pthread_cleanup_push(void (*rtn)(void*), void *arg); 设置处理函数
void pthread_cleanup_pop(int execute);
调用清理函数的时机:
a. 调用pthread_exit()时;
b. 响应 pthread_cancel()请求时;
c. 用非0 execute参数调用pthread_cleanup_pop时,如果execute参数为0,清理函数将不被调用。
注意:线程主函数返回而终止时,不会调用清理函数。
正常情况下,线程的终止状态可保存到对该线程调用pthread_join()。但如果线程处于分离状态,线程的底层存储资源可以在线程终止时立即被收回,所以此时不能通过pthread_join()来获取线程的终止状态。
。。。