Linux之线程(二)

线程所独有的

虽然线程共享进程绝大部分数据,但为了实现独立调度执行,每条线程都有独属于自己的私有资源:

  1. 线程唯一标识 ID 内核层面的 LWP、用户态 pthread_t 线程 ID,用来区分同进程下不同执行流;
  2. 寄存器上下文 程序运行时的通用寄存器、程序计数器等,线程切换时会保存 / 恢复这组寄存器数据,保证执行不会错乱;
  3. 独立栈空间 函数调用、局部变量、函数返回地址全部存放在线程私有栈,多个线程函数调用互不干扰;
  4. errno 全局错误标记 每个线程有独立的 errno 副本,一个线程函数报错修改 errno,不会影响其他线程的错误判断;
  5. 私有信号屏蔽字 每条线程可以单独设置要屏蔽的信号,线程间信号屏蔽规则互不干涉;
  6. 独立调度优先级 内核调度器会依据每条线程自身的优先级分配 CPU 时间片,同一进程内不同线程可设置不同优先级。

创建一个线程的代价远小于创建一个新进程,删除也是一致的

代码

线程创建

pthread_create

参数说明

  1. pthread_t *thread:输出参数,创建成功后存入新线程 ID(你截图里打印的 tid)
  2. const pthread_attr_t *attr:线程属性,传nullptr使用默认属性
  3. void *(*start_routine)(void *):线程入口函数,返回void*、参数void*
  4. void *arg:传给线程函数的参数,任意类型指针

返回值

  • 0:创建成功
  • 非 0:错误码(如内存不足、权限错误)

不是lwp

十六进制打印

其实这个id是一个地址,具体是什么等一下来解释


pthread_self

作用

返回调用该函数的当前线程自身 ID,无参数、无失败返回值,永远有效


新线程的tid


新线程和主线程都有tid,并且是不一样的


线程资源共享

丰富一下


多个执行流进入函数----->重入

我们将print操作封装,发现线程都可以使用------代码是共享的


定义全局变量

让新线程对其进行++

我们观察到val的值是在变化的

以上证明多线程资源共享

代码异常

异常问题:任意线程异常奔溃,会导致整个进程挂掉

让线程一下子全部都创建出来

让线程只打印一次,让内容更加清晰

但是我们确发现打印出来并不是有序的,

循环里 char threadname[64]栈局部数组,每次循环覆盖内容; 创建子线程时直接传数组地址,子线程读取时数组内容早已被下一轮循环修改,线程 name 偶尔错乱。

这样会出现数据不一致的问题

除了上面这个可能,也会有下面这种情况

printf 是行缓冲,但多线程并发调用时,一行打印会被其他线程打断穿插。 多个线程同时执行 printf,操作系统线程调度会随时切换线程,导致文字错位、顺序杂乱。

相关推荐
代码AC不AC1 小时前
【Linux】NAT与代理
linux·nat·代理
HiDev_1 小时前
【非标自动化】上位机快速上手(创建winform并运行起来)
运维·自动化
乐维_lwops1 小时前
乐维社区“专家坐诊”第405期问答
运维·cmdb·运维监控·答疑·运维智能体·乐维运维智能体
esabby1 小时前
韩国站群服务器租用平台推荐与外贸建站优势深度解析
运维·服务器
Aision_2 小时前
实习手记 Day:从 ELK 到 Agent 的“最后一公里”——告警消费与上下文富化
运维·人工智能·web安全·elk·网络安全·安全威胁分析
CDN3602 小时前
俄语区跨境站点优化实战:CDN+Nginx 解决 H5 白屏、交互延迟、链路卡顿问题
运维·nginx·交互·h5 加速·nginx 轻交互调优
邀星月为媒2 小时前
高阶加餐 08|Prompt 故障定位与可观测性:模型突然变差时,别再靠“重新写一遍 Prompt”解决
服务器·数据库·prompt
智能制造产品经理代码提升2 小时前
全流程自动化部署指南(Push自动构建 → 测试通过自动建PR → Teams通知
运维·flask·自动化
難釋懷2 小时前
Nginx重试机制
运维·nginx