
1. 线程概念
Linux里的线程,也叫轻量级进程(light weight process),本质上是进程。
Linux早期是没有线程的,后来的线程是借助进程实现的。线程、进程的核心都是调用系统的clone方法实现。
线程和进程的区别:(说明:PCB即进程控制块)
进程拥有PCB,用于独立的地址空间。是操作系统最小资源分配单位。(独居地址空间)
线程也有PCB,但没有独立的地址空间,共享同一个地址空间。是操作系统最小执行单位。(合租地址空间)
Linux内核线程实现原理:
1)轻量级进程,也有PCB,创建线程使用的底层方法和进程一样都是clone方法。
2)线程有各自的PCB,但是各自的PCB指向内存资源的三级页表是相同的。所以地址空间是相同的,即共享地址空间。
3)线程可看作是寄存器和栈的集合。
三级页表映射:进程PCB -> 页目录(可看作数组,首地址位于PCB里)-> 页表(可看作数组元素) -> 物理页表 -> 内存单元
线程共享的资源:
文件描述符、信号处理方式、当前工作目录、用户ID和组ID、内存地址空间(.text/.data/.bss/heap/so)
线程非共享的资源:
线程ID、处理器现场和内核栈指针、用户空间栈、errno变量、信号屏蔽字、线程调度优先级、线程调度策略
2. pthread线程函数
pthread_t pthread_self(void);//获取线程id,类似于进程的getpid()函数。
pthread_create(pthread_t* tid, pthread_attr_t* attr, void*(run)(void*), void* arg);//创建一个线程,类似于进程的fork()函数。
attr参数//线程属性,需要调用pthread_attr_init()函数初始化,然后再设置属性,最后调用pthread_attr_destroy()销毁。
run参数//是一个函数指针,形式 void* run(void*){},是线程创建成功后的回调函数,该函数执行周期既是线程生命周期,即该函数执行完线程就结束。
arg参数//run函数的参数。
pthread_exit();//退出一个线程,类似于进程的exit()函数。
注意1:任一个线程里调用exit()函数的话,进程退出,导致所有线程都会退出。所以退出一个线程应该调用pthread_exit()函数。
注意2:主线程return返回后,进程退出了,此时所有的子线程都会退出。
pthread_join();//主线程阻塞等待子线程退出,并获取子线程退出状态码。类似于进程的wait()函数
pthread_detach();//使线程处于分离状态,也就是说该线程执行完后自动释放所有资源包括回收PCB。
pthread_cancel();//杀死、取消一个线程,类似于进程的kill()函数。
注意:调用该方法可能不会马上杀死,需要到达一个取消点才会杀死。man 7 pthreads 查看取消点。
pthread_testcancel();//通过代码设置一个取消点。
pthread_equal();//比较两个线程是否为相同。虽然现在linux线程id是一个unsigned long int,但是其他非linux系统或者后面版本linux可能改为结构体。
终止线程的三种方式:return、pthread_exit()、pthread_cancel()
3. pthread线程属性
使用步骤、即初始化、使用、销毁:
pthread_attr_t attr;
pthread_attr_init(&attr)
pthread_create(tid, &attr, callback_fun,callback_arg)
pthread_destroy(&attr)
pthread_attr_t结构体属性:
线程分离:pthread_attr_getdetachstate()、pthread_attr_setdetachstate(PTHREAD_CREATE_DETACHED、PTHREAD_CREATE_JOINABLE)
线程栈地址:pthread_attr_getstack()、pthread_attr_setstack()
线程栈大小:pthread_attr_getstacksize()、pthread_attr_setstacksize()
4. 安装pthread线程man page手册
安装命令:sudo apt-get install manpages-posix-dev
验证安装:man -k pthread 可以列出pthread
查看当前pthread库的版本:getconf GNU_LIBPTHREAD_VERSION
使用线程库时,gcc编译需要加上 -lpthread(小写L)

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2017-12-05 OpenGL第十四节:绘制重复纹理