线程基本概念
- 程序中的一个执行路线
- CPU调度的基本单元,程序执行的最小单位
- 具有线程控制块(TCB),Linux下,有进程模拟实现,即TCB也就是task_struct结构体
- 所有的线程都共享其进程的地址空间,但是有其独立的上下文资源和栈空间
- 关于详细的线程概念,大家可以参考:https://blog.csdn.net/Code_ZX/article/details/85168337
线程控制
-
所用库:POSIX线程库,使用编译器命令时需要加“-pthread”选项
1.头文件:<pthread.h>
注:库都是对系统调用接口的封装 -
线程创建
int pthread_create(pthread_t thread, const pthread_attr_t attr, void (start_routine)(void), void arg);
thread:线程id(不被操作系统所知)
attr:设置线程属性,一般设置为默认:NULL
start_routine:线程启动后要执行的函数的地址
arg:传递给其执行函数的参数
成功返回0,失败返回错误码 -
线程组
1.引入:Linux中,线程被称为轻量级进程,即每一个用户态进程对应一个进程描述符(task_struct结构体),为了解决在没有线程时,一个进程描述符对应一个进程id的问题,则引入了线程组
2.概念:线程组,又称多线程进程,即在该进程中只有一个进程描述符,但是其对应的id并不是进程id,而是主线程id,另外的线程的id链接在主线程id之后
3.获取线程id(两个)
(a). 命令(加-L选项):ps -Lf
获取的是线程的标识符数值
2.系统调用接口
syscall(SYS_gettid)
获取的是线程的操作句柄
3.库函数
pthread_t pthread_self(void);
获取自身线程id,其实质也是线程操作句柄
注:Linux下,就pthread_t类型的线程id而言,本质就是一个进程地址空间上的一个地址
-
线程终止
1.return +返回值
注:在主线程(main)中,不适用
2.通过pthread_exit()将自己终止
void pthread_exit(void value_ptr);
value_ptr:传递给线程返回值的参数
无返回值
3.调用pthread_cancel()取消一个执行中的线程
int pthread_cancel(pthread_t thread);
thread:要终止的线程的线程id
成功返回0,失败返回错误码 -
线程等待
int pthread_join(pthread_t thread, void value_ptr);
thread:线程id
value_ptr:指向线程返回值的指针,设置为NULL,表示对其返回值不感兴趣
成功返回0,失败返回错误码
作用:释放线程资源,避免不等待导致产生类似于进程中僵尸进程,以至于造成内存泄漏的问题 -
线程返回值
1.通过return的方式返回:返回值即使return的返回值
2.通过pthread_exit()返回:返回值就是调用pthread_exit()函数时传入的参数
3.通过pthread_cancel()返回:返回值就是宏 PTHREAD_CANCELED
获取返回值代码(包含线程创建,终止,等待的代码):
https://github.com/zxshuaige/Linux_code/blob/master/pthread_t.c -
线程分离
int pthread_detach(pthread_t thread);
作用:告诉操作系统在线程退出后自动释放线程资源,即不需要再进行线程等待
注:在不关心线程返回值的时候使用线程分离释放线程资源,否则使用线程等待释放线程资源,不能即使用线程等待,又使用线程分离,二者只能取其一
线程分离测试代码:https://github.com/zxshuaige/Linux_code/blob/master/pthread_d.c
谢谢大家的阅读,希望你们有所收获,最近复习Linux的基本知识,希望能熟练使用Linux…