各线程共享的资源:

1、文件描述符表。

2、每种信号的处理方式(SIG_IGN、SIG_DFL或者自定义的信号处理函数)

3、当前工作目录。

4、用户id和组id。

各线程独立的资源:

1、线程id。

2、上下文,包括各种寄存器的值、程序计算器和栈指针。

3、栈空间。

4、errno变量。

5、信号量屏蔽字。

6、调度优先级。

如果任意一个线程调用了exit或_exit,则整个线程的所有线程都终止。

终止线程:

1、从线程函数return,这种方法对主线程不适用,从main函数return相当于调用exit。

2、一个线程可以调用pthread_cancel终止同一进程中的另一个线程。

3、线程可以调用pthread_exit终止自己。

线程等待:

1、如果thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数返回值。

2、如果thread线程被别的线程调用pthread_cancel异常终止掉,value_ptr所指向的单元存放的是常数PTHREAD_CANCELED。

3、如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元里存放的是传给pthread_exit的参数。如果对thread线程的终止状态不感兴趣,可以传NULL给value_ptr参数。

线程分离:

在任何一个时间点上,线程是可结合的或者是分离的。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。

默认情况下,线程被创建成可结合的。为了避免存储器泄漏,每个可结合线程都应该要被显示地回收,即调用pthread_join;要么通过调用pthread_detach函数被分离。

如果一个可结合线程结束运行但没有被join,则它的状态类似于进程中的僵尸进程,即还有一部分资源没有被回收,所以创建线程者应该调用pthrea_join来等待线程运行结束,并可得到线程的退出码,回收其资源。

由于调用pthread_join后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。例如,在Web服务器中当主线程为每个新来的连接请求创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的连接请求),这时可以在子线程中加入代码pthread_detach(pathread_self()或者父线程调用pthread_detach(thread_id)(非阻塞,可立即返回)

这将子线程的状态设置为分离的,如此一来,该线程运行结束后自动释放所有资源。