当前位置: 首页 > news >正文

Linux应用层开发--线程

一、 Linux 线程简介

一、什么是线程(Thread)?

  • 线程进程内的一个轻量级执行单元

  • 一个进程中可以有多个线程,并且这些线程共享进程的大部分资源。


二、线程 vs 进程 对比

特性进程(Process)线程(Thread)
地址空间独立共享(代码段、数据段、堆等)
资源(文件描述符等)独立共享
栈空间各有独立栈每个线程有独立栈
通信效率进程间通信较复杂线程间通信简单(共享内存)
切换开销大(涉及内核资源切换)小(不涉及页表切换等)
使用场景稳定、安全(如守护进程)高并发、高性能场景(如 Web 服务器)

三、线程的优缺点

优点
  • 创建、销毁、切换效率高

  • 占用资源少

  • 线程间通信方便(共享数据)

⚠️ 缺点
  • 多线程共享数据,易引发同步问题/竞态条件

  • 错误容易影响整个进程

二、线程创建

1、 线程控制


2、 线程创建:pthread_create

函数原型
#include <pthread.h>int pthread_create(pthread_t *thread,                        // 线程ID指针const pthread_attr_t *attr,               // 线程属性,默认传 NULLvoid *(*start_routine)(void *),           // 线程函数指针void *arg                                 // 线程函数参数
);
返回值:
含义
0成功
0失败,返回错误码
pthread_t 定义
typedef unsigned long int pthread_t; // 实质上是无符号长整型
使用说明:
  • start_routine 为线程入口函数,格式统一为:

    void *thread_func(void *arg);
    
  • 参数可以通过结构体传入,返回值也可以是结构体指针。

  • 若不需参数或返回值,可传 NULL 和返回 NULL


程序运行逻辑

  1. 主线程中,创建两个线程:

    • input_thread:监听标准输入,写入共享缓冲区。

    • output_thread:读取共享缓冲区,打印到标准输出。

  2. 使用 pthread_join 等待两个线程完成(但由于是无限循环,这里只是保持主线程不退出)。

三、线程终止

线程终止的方式

线程可以通过以下几种方式终止:

方式说明
return在线程函数内直接返回,相当于 pthread_exit(NULL)
pthread_exit在线程函数中调用,主动退出线程
pthread_cancel由其他线程发起,异步请求取消
线程终止后资源是否自动回收? 默认不会,需 pthread_joinpthread_detach 处理

函数详解


1)pthread_exit

#include <pthread.h>void pthread_exit(void *retval);
  • 结束调用该函数的线程。

  • 可向其他线程返回数据 retval

  • 注意:retval 不要指向局部变量(函数栈帧会被销毁)。

  • 推荐 使用 malloc 分配返回内容,在 pthread_join 后回收。


2)pthread_join

#include <pthread.h>int pthread_join(pthread_t thread, void **retval);
  • 等待指定线程终止,获取其返回值并回收资源

  • 用于阻塞等待线程结束,类似于进程中的 waitpid()

  • retval 可以为 NULL,如果你不关心线程返回值。

  • 成功返回 0,失败返回错误码。


3)pthread_detach

#include <pthread.h>int pthread_detach(pthread_t thread);
  • 将线程设置为 detached(分离)状态

    • 线程退出时,其资源自动释放,不再需要 pthread_join
  • 适用于主线程不关心子线程退出状态的场景。

  • pthread_join 互斥,不能对同一线程调用两者。


4)pthread_cancel

#include <pthread.h>int pthread_cancel(pthread_t thread);
  • 向目标线程发送 取消请求(并非强制终止)。

  • 实际是否终止取决于:

    • 取消状态:enable / disable

    • 取消类型:deferred / asynchronous

  • 线程默认

    • 状态:enable

    • 类型:deferred

  • 被取消线程必须在“取消点函数”中才会响应(如 read, sleep, pthread_join 等)。

如果线程成功被取消,pthread_join 获取到的返回值为:

retval == PTHREAD_CANCELED

5)pthread_setcancelstate

#include <pthread.h>int pthread_setcancelstate(int state, int *oldstate);
  • 设置当前线程是否 允许被取消
宏定义含义
PTHREAD_CANCEL_ENABLE允许(默认)
PTHREAD_CANCEL_DISABLE禁止被取消
  • oldstate 可为 NULL,也可保存原状态。

6)pthread_setcanceltype

#include <pthread.h>int pthread_setcanceltype(int type, int *oldtype);
  • 设置当前线程的 取消类型
宏定义含义
PTHREAD_CANCEL_DEFERRED延迟取消(默认)
PTHREAD_CANCEL_ASYNCHRONOUS异步取消(不建议轻易使用)

小结对比表

方法用途是否释放资源获取返回值场景
pthread_exit线程主动退出❌(需 join 或 detach)返回数据
return简化版 exit简单返回
pthread_join等待并获取返回值主线程等子线程
pthread_detach自动资源释放不关心返回值
pthread_cancel异步取消线程❌(需 join 回收)✅(可得 CANCELED)主动终止
http://www.dtcms.com/a/332639.html

相关文章:

  • react性能优化之useRef和useState
  • Nginx性能优化与安全配置:打造高性能Web服务器
  • Unity:PlayerPrefs笔记
  • 标准电子邮件地址格式(RFC 5322 里的 mailbox 语法)
  • ABAP : 内表/工作区转JSON
  • Prometheus 监控 Kubernetes Cluster 最新极简教程
  • FreeRTOS多核支持
  • 从根本上解决MAC权限问题(关闭sip)
  • 汽车后雾灯色度难达标?OAS 软件精准解决破瓶颈
  • 图论Day3学习心得
  • Chrome插件开发实战:从架构到发布全流程
  • Docker Compose部署Clickhouse最新版
  • 【软件设计模式】工厂方法与抽象工厂
  • 关于截屏时实现游戏暂停以及本地和上线不同步问题
  • pycharm2025导入anaconda创建的各个AI环境
  • C++第二十课:快递运费计算器 / 黑白配+石头剪刀布小游戏
  • 医院网络安全重保方案
  • 用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
  • 从电影分类到鸢尾花识别:KNN 算法实战指南
  • @[TOC](计算机是如何⼯作的) JavaEE==网站开发
  • MySQL 关键字总结,并结合 SQL 类型(DDL / DML / DQL / DCL / TCL) 说明每类关键字的作用、使用场景和示例
  • 华为实验综合小练习
  • Android RxJava变换操作符详解
  • MuMu模拟器Pro Mac 安卓手机平板模拟器(Mac中文)
  • 9.对象介绍
  • iOS App TF 上架多工具协作实战,一次高效的应用内测分发流程
  • 【数据结构初阶】--排序(三):冒泡排序、快速排序
  • Tomcat部署JDK8项目启动失败:系统化诊断指南
  • 【科研绘图系列】R语言绘制多种饼图
  • OpenCV 阈值处理