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

进程和线程 (线程)

1.基本概念:

  • 线程是一个轻量级的进程
  • 线程本质就是一个进程
  • 线程和进程不完全一致,轻量指空间,进程空间和线程空间管理方法不同

2.进程和线程区别:

1. 线程本质

是进程,线程是任务创建、调度、回收的过程

2. 进程空间:

文本段 + 数据段 + 系统数据段

3. 线程空间:

  • 线程必须位于进程空间内部,没有进程,线程无法独立存在
  • 一个进程中的所有线程共享文本段+数据段+堆区,独享栈区
  • 线程独享的栈区默认为8M
  • 一个进程中的多个线程切换调度任务时,资源开销比较小

4. 进程和线程区别:

  • 线程是CPU任务调度的最小单元
  • 进程是操作系统资源分配的最小单元

3.多进程和多线程的优缺点

1. 多线程和多进程对比:

多线程 vs 多进程对比(C语言)
特性多线程(Thread)多进程(Process)
创建方式使用 pthread_create(POSIX线程)使用 forkexec 系列函数
资源开销轻量级,共享同一进程的内存空间重量级,独立内存空间,复制父进程资源(写时复制)
通信机制共享全局变量、互斥锁(pthread_mutex_t)、条件变量管道(pipe)、共享内存、信号、套接字、消息队列
同步机制互斥锁、信号量、读写锁文件锁、信号量、信号
数据隔离性线程共享数据,需同步避免竞争进程数据默认隔离,共享需显式操作
崩溃影响线程崩溃可能导致整个进程终止单个进程崩溃不影响其他进程
上下文切换成本低(共享地址空间)高(需切换内存映射表)
适用场景CPU密集型任务(需并行计算)、高响应需求需要高稳定性、隔离性的任务(如服务隔离)
示例代码```c```c
#include <pthread.h>#include <unistd.h>
void* task(void* arg) { /.../ }int main() {
int main() {if (fork() == 0) { /子进程/ }
pthread_t tid;else { /父进程/ }
pthread_create(&tid, NULL, task, NULL);}
}```
```
关键差异说明

性能差异
多线程的创建和切换速度更快,适合频繁创建的任务。多进程由于独立的地址空间,更适合需要高安全性和稳定性的场景。

资源共享
线程默认共享堆、全局变量和文件描述符,进程需要显式共享(如通过 shmgetmmap)。

调试难度
多线程因共享数据可能导致竞态条件(Race Condition),调试复杂度较高;多进程的隔离性使得问题更容易定位。

跨平台兼容性
多进程(如 fork)在 Unix/Linux 系统支持良好,Windows 需使用 CreateProcess;多线程的 pthread 需注意平台实现差异。

4.线程的调度:

  • 调度保持一致
  • 宏观并行,微观串行

5.线程的消亡:

线程结束需要回收线程空间,否则产生僵尸线程

6.线程的函数接口

1. 函数接口:

2. pthread_create

3. pthread_self

4. pthread_exit

5. pthread_join

注意:

tid对应的线程只要不退出,pthread_join阻塞等待结束回收线程空间 pthread_join具备同步功能

http://www.dtcms.com/a/333406.html

相关文章:

  • C#内嵌字符串格式化输出
  • C语言实现类似C#的格式化输出
  • Kubernetes(3)控制器的应用详解
  • 【Linux应用】V4L2的摄像头配置、获取等操作,并进行视频录制
  • 准直太阳光模拟器 | HUD 光照角度和强度的测试应用
  • 论文解读:从工具人到永动机,AI代理(AI Agent、智能体)如何跨越静态到自进化的鸿沟?
  • Effective Java笔记:类层次优于标签类
  • k8s单master部署
  • 用 Enigma Virtual Box 将 Qt 程序打包成单 exe
  • QT|windwos桌面端应用程序开发,当连接多个显示器的时候,如何获取屏幕编号?
  • 【C#补全计划】委托
  • 基于RobustVideoMatting(RVM)进行视频人像分割(torch、onnx版本)
  • 【opencv-Python学习笔记(5):几何变换】
  • 补充日志之-配置文件解析指南(Centos7)
  • 容器内部再运行Docker(DinD和DooD)
  • CUDA中的基本概念
  • Linux软件编程:进程线程(线程)
  • 结构体(Struct)、枚举(Enum)的使用
  • 基于SpringBoot的房产销售系统
  • 护栏卫士碰撞报警系统如何实时监测护栏的状态
  • 系统时钟配置
  • 38 C++ STL模板库7-迭代器
  • 用ICO图标拼成汉字
  • BFS和codetop复习
  • 复杂度扫尾+链表经典算法题
  • Klipper-probe模块
  • H5449G降压恒流无人机照明驱动芯片方案24V/36V/48V/72V降6V12V9V /8A替换NCL30160
  • 探索无人机图传技术:创新视野与无限可能
  • C#WPF实战出真汁06--【系统设置】--餐桌类型设置
  • Linux 系统中, LANG 和 LC_ALL变量有什么区别与联系?