Linux之线程(二) 📅 2026/8/13 8:38:30 线程所独有的虽然线程共享进程绝大部分数据但为了实现独立调度执行每条线程都有独属于自己的私有资源线程唯一标识 ID内核层面的 LWP、用户态 pthread_t 线程 ID用来区分同进程下不同执行流寄存器上下文程序运行时的通用寄存器、程序计数器等线程切换时会保存 / 恢复这组寄存器数据保证执行不会错乱独立栈空间函数调用、局部变量、函数返回地址全部存放在线程私有栈多个线程函数调用互不干扰errno 全局错误标记每个线程有独立的 errno 副本一个线程函数报错修改 errno不会影响其他线程的错误判断私有信号屏蔽字每条线程可以单独设置要屏蔽的信号线程间信号屏蔽规则互不干涉独立调度优先级内核调度器会依据每条线程自身的优先级分配 CPU 时间片同一进程内不同线程可设置不同优先级。创建一个线程的代价远小于创建一个新进程,删除也是一致的代码线程创建pthread_create参数说明pthread_t *thread输出参数创建成功后存入新线程 ID你截图里打印的 tidconst pthread_attr_t *attr线程属性传nullptr使用默认属性void *(*start_routine)(void *)线程入口函数返回void*、参数void*void *arg传给线程函数的参数任意类型指针返回值0创建成功非 0错误码如内存不足、权限错误不是lwp十六进制打印其实这个id是一个地址,具体是什么等一下来解释pthread_self作用返回调用该函数的当前线程自身 ID无参数、无失败返回值永远有效新线程的tid新线程和主线程都有tid,并且是不一样的线程资源共享丰富一下多个执行流进入函数-----重入我们将print操作封装,发现线程都可以使用------代码是共享的定义全局变量让新线程对其进行我们观察到val的值是在变化的以上证明多线程资源共享代码异常异常问题:任意线程异常奔溃,会导致整个进程挂掉让线程一下子全部都创建出来让线程只打印一次,让内容更加清晰但是我们确发现打印出来并不是有序的,循环里char threadname[64]是栈局部数组每次循环覆盖内容 创建子线程时直接传数组地址子线程读取时数组内容早已被下一轮循环修改线程 name 偶尔错乱。这样会出现数据不一致的问题除了上面这个可能,也会有下面这种情况printf是行缓冲但多线程并发调用时一行打印会被其他线程打断穿插。 多个线程同时执行 printf操作系统线程调度会随时切换线程导致文字错位、顺序杂乱。