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

操作系统学习(六)——多线程

一、多线程

多线程(Multithreading)是操作系统和编程语言中实现并发的一种核心技术,它允许一个进程内并行地执行多个线程(轻量级进程)
它广泛应用于 GUI 响应、服务器并发处理、计算密集型任务优化等场景。

线程是程序执行的最小单位,是进程中的执行路径
一个进程可以包含多个线程,这些线程共享

  • 内存空间(代码段、数据段、堆);
  • 文件描述符
  • 打开的资源
    但每个线程拥有独立的栈、程序计数器(PC)和寄存器

特点:

  1. 提高程序并发性
    可同时处理多个任务(如 UI + 下载);
  2. 提升资源利用率
    特别适合多核 CPU 并行计算;
  3. 改进程序结构
    逻辑清晰,例如用不同线程处理输入、处理、输出;
  4. 响应更快
    在 GUI 程序中避免界面卡顿(主线程负责UI,子线程执行耗时操作)。

二、单线程 vs 多线程

比较点单线程多线程
并发能力支持多个任务并发执行
CPU 利用率高,尤其在多核 CPU
响应性较差(容易卡顿)高,可边计算边响应
资源开销中,开销小于多进程
编程复杂度简单较复杂(需处理同步问题)

三、多线程线程的同步机制

在多线程中对共享资源操作时,需使用同步机制来防止竞争条件:

同步机制描述
互斥锁(mutex)一次只有一个线程进入临界区
条件变量实现线程等待和通知
信号量控制多个线程对资源的并发访问
屏障(barrier)等待所有线程到达后统一推进
原子变量无需加锁实现简单同步

四、多线程的创建

1. C语言 POSIX 多线程:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>#define NUM_THREADS 5void* thread_func(void* arg) 
{int id = *(int*)arg;printf("Thread %d is running.\n", id);free(arg);  // 动态分配需释放return NULL;
}int main() 
{pthread_t threads[NUM_THREADS];for (int i = 0; i < NUM_THREADS; ++i) {int* id = malloc(sizeof(int));  // 使用堆内存避免数据竞争*id = i;pthread_create(&threads[i], NULL, thread_func, id);}for (int i = 0; i < NUM_THREADS; ++i) {pthread_join(threads[i], NULL);}return 0;
}

2. C++11 多线程:

#include <iostream>
using namespace std;
#include <thread>
#include <vector>void thread_func(int id)
{cout << "Thread " << id << " is running." << endl;
}int main()
{const int NUM_THREADS = 5;vector<thread> threads;for (int i = 0; i < NUM_THREADS; ++i){threads.emplace_back(thread_func, i);  // 创建并启动线程}for (auto& t : threads){t.join();  // 等待每个线程结束}return 0;
}

3. Python 中的多线程:

import threadingdef thread_func(id):print(f"Thread {id} is running.")threads = []
for i in range(5):t = threading.Thread(target=thread_func, args=(i,))threads.append(t)t.start()for t in threads:t.join()

五、线程池(Thread Pool)

为了避免频繁创建销毁线程的开销,可使用线程池:

  • 预创建一组线程等待任务;
  • 提交任务后由空闲线程执行;
  • 常用于 Web服务器爬虫任务队列等。

六、多线程的问题

问题描述
竞态条件多线程访问共享资源可能引发数据竞争
死锁多线程互相等待资源导致系统僵死
资源争用多线程争抢 CPU 或内存资源
上下文切换开销线程切换需要保存/恢复状态,消耗 CPU 时间
可重入性问题非线程安全函数被多个线程调用会出错

七、应用场景

场景描述
Web服务器每个请求一个线程或线程池处理
GUI程序主线程处理 UI,子线程处理后台逻辑
多核并行计算将大任务分成多个线程分工计算
数据处理管道(流水线)每一步由一个线程负责,提高效率
异步 I/O使用线程避免阻塞主流程

八、多线程 vs 多进程

比较点多线程多进程
资源开销小,共享内存空间大,各进程独立内存
创建销毁开销小,速度快大,开销高
通信方式共享变量IPC机制(管道、共享内存等)
稳定性稍差,一个线程崩溃可能影响进程高,互不影响
并发性能高,适合密集计算高,适合任务隔离
http://www.xdnf.cn/news/10317.html

相关文章:

  • 机器视觉视觉中的棋盘格到底是什么?为什么是棋盘格?
  • AI FOR SCIENCE 2025 报告解读
  • MES系统:助力企业数字化转型
  • 修改Docker镜像源
  • web前端使用xlsx和file-saver实现前端表格table数据导出Excel功能
  • mysql的Memory引擎的深入了解
  • QML 无边框窗口翻转动画
  • pikachu通关教程-目录遍历漏洞(../../)
  • Wayland模式X11模式LinuxFB​​模式,Linux图形显示系统三大模式深度解析
  • Vue2 与 Vue3对比
  • 【通关文件操作(下)】--文件的顺序读写(续),sprintf和sscanf函数,文件的随机读写,文件缓冲区,更新文件
  • AI赋能SEO关键词策略
  • CVE-2019-17558源码分析与漏洞复现
  • 电子电路:电路设计中的温度补偿技术
  • Python打卡训练营day40——2025.05.30
  • MySQL 高可用实现方案详解
  • Nature:多模态大模型LLMs如何驱动多组学与生命科学研究新范式?
  • DiTAR: Diffusion Transformer Autoregressive Modeling for Speech Generation
  • 02业务流程的定义
  • 【连接器专题】SD卡座规格书审查需要审哪些方面?
  • day40python打卡
  • 国产三维CAD皇冠CAD(CrownCAD)建模教程:冷却液箱阀门
  • 关于位图Bitmaps的介绍
  • vue为什么点击两遍才把参数传递过去
  • 边缘计算网关支撑医院供暖系统高效运维的本地化计算与边缘决策
  • 什么是 pyenv?
  • 【Vim】高效编辑技巧全解析
  • RFID推动医行智能终审系统药物管理应用案例
  • 基于springboot的医护人员排班系统设计与实现(源码+文档+部署讲解)
  • 每天掌握一个Linux命令 - fail2ban