线程介绍
-
同时执行四个线程的进程:
-
线程共享的一些数据:
-
终止线程:
- 在线程里面调用return 可以终止线程
- 线程里面,不管那个线程的子函数调用pthread_exit(),该线程都会退出
- 调用pthread_cancel取消线程
- 任意线程调用了exit,或者主线程执行了return 语句,都会导致进程中所有线程停止
- 主线程中调用pthread_exit(),不会影响进程中的其它线程
/************************ 函数功能:返回调用线程ID,和pthread_create的第一个参数thread的值相同 返回值: This function always succeeds, returning the calling thread's ID. ************************/ #include <pthread.h> pthread_t pthread_self(void); /************************ 函数功能:比较两个线程ID是否相同,因为pthread_t是一种不透明的数据结构,我们不能简单的用C语言中的等号来比较,这样移植性太差 返回值:If the two thread IDs are equal, pthread_equal() returns a nonzero value; otherwise, it returns 0. ************************/ #include <pthread.h> pthread_t pthread_equal(void);
- linux线程实现中,线程ID在所有进程中都是唯一的,不过在其它实现中未必如此
- POSIX线程ID与linux专有的系统调用gettid所返回的线程ID并不相同,前者由线程库管理,后者由内核分配管理
-
pthread_join(等待标识为thread的线程终止,这一过程也可以被称为连接)调用需要注意的地方:
- 线程之间关系对等,就算线程A创建了线程B,B也可以pthread_joinA,不像进程间,只能父进程wait子进程
- 无法,连接任意线程,换句话说只能连接同一个线程组的线程,也不能以非阻塞的形式连接
-
pthread_detach函数是设置调用线程处于分离状态,此时不能使用pthread_join来获取其状态,也无法使其从返回可连接状态,此状态下,线程结束后,会自动清楚相关占用的资源,也就是会自动收尸,不会变成僵尸线程,如果线程没有处于分离状态,就必须调用pthread_join为其收尸,否则会处于僵尸状态,占用系统资源,导致无法在创建线程,但是主线程执行return退出还是会影响分离状态下的线程
//线程分离 pthread_detach(pthread_self())
-
使用线程注意:
- 尽量避免使用信号
- 所有线程尽量服务于一个应用程序
- 除了数据,线程还可以共享其它信息(文件描述符、信号处置、当前工作目录等)