C语言:多线程

多线程概述

定义

多线程是指在一个程序中可以同时运行多个不同的执行路径(线程),这些线程可以并发或并行执行。并发是指多个线程在宏观上同时执行,但在微观上可能是交替执行的;并行则是指多个线程真正地同时执行,通常需要多核处理器的支持。

优点

  • 提高程序性能:充分利用多核处理器的资源,减少程序的执行时间。例如,在一个图像处理程序中,可以使用多个线程分别处理不同区域的图像,从而加快处理速度。

  • 增强响应性:在图形用户界面(GUI)程序中,使用多线程可以避免主线程被耗时的操作阻塞,保证界面的流畅性和响应性。例如,当用户点击一个按钮触发一个耗时的计算任务时,可以使用一个新的线程来执行该任务,而主线程继续处理用户的其他操作。

  • 提高资源利用率:在等待某些操作(如I/O操作)完成时,线程可以让出CPU资源,让其他线程继续执行,从而提高CPU的利用率。

缺点

  • 线程安全问题:多个线程同时访问共享资源时,可能会导致数据竞争、不一致等问题。例如,多个线程同时对一个共享变量进行读写操作,可能会导致数据的错误更新。

  • 上下文切换开销:线程的切换需要保存和恢复线程的上下文信息,这会带来一定的开销,尤其是在频繁切换线程的情况下。

  • 死锁问题:多个线程在竞争资源时,可能会出现死锁的情况,即每个线程都在等待其他线程释放资源,从而导致所有线程都无法继续执行。

多线程的实现

操作系统层面的支持

现代操作系统都提供了对多线程的支持,不同的操作系统有不同的线程实现方式。常见的线程库有:

  • POSIX线程库(pthread):是一种跨平台的线程库,广泛应用于Unix、Linux和macOS等操作系统。它提供了一组函数来创建、管理和同步线程。

  • Windows线程库:Windows操作系统提供了自己的线程库,通过CreateThread等函数来创建和管理线程。

C语言中的多线程实现

(以pthread线程的创建和销毁为例)

#include <stdio.h>
#include <pthread.h>// 线程函数
void* thread_function(void* arg) {printf("This is a new thread.\n");return NULL;
}int main() {pthread_t thread;// 创建线程if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {perror("pthread_create");return 1;}// 等待线程结束if (pthread_join(thread, NULL) != 0) {perror("pthread_join");return 1;}printf("Main thread: New thread has finished.\n");return 0;
}

代码解释

  • pthread_create:用于创建一个新的线程,第一个参数是指向线程标识符的指针,第二个参数是线程的属性,通常设为NULL,第三个参数是线程函数的指针,第四个参数是传递给线程函数的参数。

  • pthread_join:用于等待指定的线程结束,并回收其资源。

线程的同步和互斥

为了避免多个线程同时访问共享资源时出现数据竞争等问题,需要使用同步和互斥机制。常见的同步和互斥机制有互斥锁(Mutex)、条件变量(Condition Variable)和信号量(Semaphore)等。

互斥锁示例

#include <stdio.h>
#include <pthread.h>// 定义互斥锁
pthread_mutex_t mutex;
// 共享资源
int shared_variable = 0;// 线程函数
void* thread_function(void* arg) {// 锁定互斥锁pthread_mutex_lock(&mutex);// 访问共享资源shared_variable++;printf("Thread: shared_variable = %d\n", shared_variable);// 解锁互斥锁pthread_mutex_unlock(&mutex);return NULL;
}int main() {pthread_t thread1, thread2;// 初始化互斥锁pthread_mutex_init(&mutex, NULL);// 创建线程pthread_create(&thread1, NULL, thread_function, NULL);pthread_create(&thread2, NULL, thread_function, NULL);// 等待线程结束pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 销毁互斥锁pthread_mutex_destroy(&mutex);return 0;
}

代码解释

  • pthread_mutex_init:初始化互斥锁。

  • pthread_mutex_lock:锁定互斥锁,如果互斥锁已经被其他线程锁定,则当前线程会阻塞。

  • pthread_mutex_unlock:解锁互斥锁,允许其他线程锁定该互斥锁。

  • pthread_mutex_destroy:销毁互斥锁,释放相关资源。

多线程编程的注意事项

线程安全

在多线程编程中,要确保对共享资源的访问是线程安全的。可以通过使用同步和互斥机制来实现线程安全,避免数据竞争和不一致的问题。

死锁避免

死锁是多线程编程中常见的问题,为了避免死锁,可以采用以下方法:

  • 按顺序加锁:确保所有线程按照相同的顺序获取锁,避免循环等待。

  • 限时加锁:在获取锁时设置一个超时时间,如果在规定时间内无法获取锁,则放弃锁的获取,避免线程一直阻塞。

资源管理

在多线程编程中,要注意资源的管理,避免资源泄漏。例如,在使用完互斥锁、条件变量等资源后,要及时销毁。

多线程的应用场景

服务器端编程

在服务器端编程中,多线程可以用于处理多个客户端的请求。每个客户端的请求可以由一个独立的线程来处理,从而提高服务器的并发处理能力。

并行计算

在科学计算、图像处理等领域,多线程可以用于并行计算,将一个大的任务分解成多个小的子任务,由多个线程同时执行,从而加快计算速度。

图形用户界面(GUI)编程

在GUI编程中,多线程可以用于处理耗时的操作,避免主线程被阻塞,保证界面的流畅性和响应性。例如,在一个文件下载的GUI程序中,可以使用一个新的线程来执行文件下载任务,而主线程继续处理用户的其他操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux线程池实现

1.线程池实现 全部代码&#xff1a;whb-helloworld/113 1.唤醒线程 一个是唤醒全部线程&#xff0c;一个是唤醒一个线程。 void WakeUpAllThread(){LockGuard lockguard(_mutex);if (_sleepernum)_cond.Broadcast();LOG(LogLevel::INFO) << "唤醒所有的休眠线程&q…

微信小程序逆向开发

一.wxapkg文件 如何查看微信小程序包文件&#xff1a; 回退一级 点击进入这个目录 这个就是我们小程序对应的文件 .wxapkg概述 .wxapkg是微信小程序的包文件格式&#xff0c;且其具有独特的结构和加密方式。它不仅包含了小程序的源代码&#xff0c;还包括了图像和其他资源文…

多输入多输出 | Matlab实现CPO-LSTM冠豪猪算法优化长短期记忆神经网络多输入多输出预测

多输入多输出 | Matlab实现CPO-LSTM冠豪猪算法优化长短期记忆神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现CPO-LSTM冠豪猪算法优化长短期记忆神经网络多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现CPO-LSTM冠豪猪算法优化长短期…

视频编码器的抉择:x264、x265、libaom、vvenc 对比测试实验

264、x265、libaom、vvenc 对比测试实验 测试机器配置&#xff1a;Apple M1 Pro -16G编码器版本&#xff08;选择自己编译&#xff09;&#xff1a;所有源码都是当前最新更新的状态&#xff0c;此外各类编码具体的编译过程可参考我的相关系列博客。 编码器GitHubx264git clon…

【二刷代码随想录】双指针-数组相关题型、推荐习题

一、双指针-数组 相关题型与常用思路 1、单个数组 &#xff08;1&#xff09;原地移除元素类 如推荐习题中的&#xff08;1&#xff09;、&#xff08;2&#xff09;、&#xff08;3&#xff09;&#xff0c;都属于此类。引入双指针 pre、last &#xff0c;用 pre 指针表明数…

Level DB --- TableCache

TableCache 是Level DB 中重要的类&#xff0c;Level DB 中多层&#xff08;multi level&#xff09;&#xff0c;且每一层&#xff08;level&#xff09;有多个 key-value file&#xff0c;TableCache正是用来缓存多层以及多层中的file数据&#xff0c;更快速地检索。 table …

搜索-BFS

马上蓝桥杯了&#xff0c;最近刷了广搜&#xff0c;感觉挺有意思的&#xff0c;广搜题类型都差不多&#xff0c;模板也一样&#xff0c;大家写的时候可以直接套模板 这里给大家讲一个比较经典的广搜题-迷宫 题目问问能否走到 (n,m) 位置&#xff0c;假设最后一个点是我们的&…

智能预测维护:让设备“未卜先知”,减少宕机烦恼

智能预测维护:让设备“未卜先知”,减少宕机烦恼 1. 引言:设备维护的痛点与出路 在工业生产和自动化领域,设备故障一直是令人头疼的问题。设备一旦故障,轻则影响生产效率,重则造成严重损失,甚至带来安全隐患。传统的设备维护方式主要有两种: 被动维护(Reactive Maint…

安卓的布局方式

一、RelativeLayout 相对布局 特点&#xff1a;每个组件相对其他的某一个组件进行定位。 (一)主要属性 1、设置和父组件的对齐&#xff1a; alignParentTop &#xff1a; 设置为true&#xff0c;代表和父布局顶部对齐。 其他对齐只需要改变后面的Top为 Left、Right 或者Bottom&…

SSM中药分类管理系统

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 SS…

epoch、batch、batch size、step、iteration深度学习名词含义详细介绍

卷积神经网络训练中的三个核心概念&#xff1a;Epoch、Batch Size 和迭代次数 在深度学习中&#xff0c;理解一些基本的术语非常重要&#xff0c;这些术语对模型的训练过程、效率以及最终性能都有很大影响。以下是一些常见术语的含义介绍&#xff1a; 1. Epoch&#xff08;周…

React(七):Redux

Redux基本使用 纯函数&#xff1a;1.函数内部不能依赖函数外部变量&#xff1b;2.不能产生副作用&#xff0c;在函数内部改变函数外部的变量 React只帮我们解决了DOM的渲染过程&#xff0c;State还是要由我们自己来管理——redux可帮助我们进行管理 Redux三大特点 1.单一数…

《Android低内存设备性能优化实战:深度解析Dalvik虚拟机参数调优》

1. 痛点分析&#xff1a;低内存设备的性能困局 现象描述&#xff1a;大应用运行时频繁GC导致卡顿 根本原因&#xff1a;Dalvik默认内存参数与硬件资源不匹配 解决方向&#xff1a;动态调整堆内存参数以平衡性能与资源消耗 2. 核心调优参数全景解析 关键参数矩阵&#xff1…

STC89C52单片机学习——第38节: [17-2] 红外遥控红外遥控电机

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.03.30 51单片机学习——第38节: [17-2] 红外遥控&红外遥控电机 前言开发板说明引用…

计算机组成原理————计算机运算方法精讲<1>原码表示法

第一部分:无符号数和有符号数的概念 1.无符号数 计算机中的数均存放在寄存器当中,通常称寄存器的位数为机器字长,所谓无符号数,就是指没有fu5号的数,在寄存器中的每一位均可用来存放数值,当存放有符号数时,需要留出位置存放符号,机器字长相同时,无符号数与有符号数所…

【什么是机器学习——多项式逼近】

什么是机器学习——多项式逼近 机器学习可以分成三大类别,监督学习、非监督学习、强化学习。三大类别背后的数学原理不同。监督学习使用了数学分析中的函数逼近方法和概率统计中的极大似然方法;非监督学习使用聚类和EM算法;强化学习使用马尔可夫决策过程的想法。 机器学习的…

Ubuntu 22.04 上安装阿里云 CLI(命令行工具)

在 Ubuntu 22.04 上安装阿里云 CLI&#xff08;命令行工具&#xff09;可以通过以下步骤完成&#xff1a; 步骤 1&#xff1a;下载阿里云 CLI 安装包 打开终端&#xff0c;首先更新你的软件包索引&#xff1a; sudo apt update安装 curl&#xff08;如果还没有安装&#xff09…

​Android Gradle 插件(AGP)版本与 ​Gradle 版本需要严格对应

一、AGP 与 Gradle 版本对照表 Android Gradle 插件版本对应 Gradle 版本适用 Android Studio 版本​8.1.x8.2Arctic Fox (2020.3.1+)​8.0.x8.0Arctic Fox (2020.3.1+)​7.4.x7.5.1IntelliJ IDEA 2022+​7.3.x7.4IntelliJ IDEA 2022+​7.2.x7.3.3IntelliJ IDEA 2021.3+​7.1.x…

【Matlab】-- 基于MATLAB的灰狼算法优化支持向量机的回归算法

文章目录 文章目录 01 内容概要02 GWO-SVR模型03 部分代码04 运行结果05 参考文献06 代码下载 01 内容概要 GWOSVR&#xff08;基于灰狼算法优化的支持向量机回归&#xff09;是一种先进的机器学习技术&#xff0c;它结合了灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO…

Google Play Games PC版即将正式上线!

早在 2021 年&#xff0c;谷歌就推出 Google Play Games PC 版&#xff0c;本质上是基于虚拟化创建安卓系统在 Windows 上运行 Google Play 平台的各种游戏。 在测试了 4 年后&#xff0c;谷歌准备在今年晚些时候正式上线该平台&#xff0c;谷歌将在下周举办 2025 游戏开发者大…