【手撕C语言】多线程
- (꒪ꇴ꒪ ),Hello我是祐言QAQ
- 我的博客主页:C/C++语言,Linux基础,ARM开发板,软件配置等领域博主🌍
- 快上🚘,一起学习,让我们成为一个强大的攻城狮!
- 送给自己和读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!
- 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏
一、概念解析
1.什么是C语言线程?
C语言是一种面向过程的编程语言,不像Java等高级语言内置了线程类和库。C语言通过调用操作系统提供的线程库来实现多线程编程。在C语言中,线程是进程内的执行单元,一个进程可以包含多个线程,它们共享进程的资源,但拥有独立的栈空间。
2.C语言中的线程库
C语言中通常使用POSIX线程库(也称为pthread库)来进行多线程编程。POSIX线程库是一个跨平台的线程库,提供了创建、同步和销毁线程的函数。在Linux、macOS等UNIX-like系统中,该库已经内置,而在Windows系统中可以通过一些第三方库或者编译器特定的选项来支持。
3.多线程的优势
- 提高程序的并发性:多线程允许程序同时执行多个任务,从而提高程序的并发性和响应性。
- 充分利用多核处理器:多线程可以在多核处理器上并行执行,充分利用硬件资源。
- 支持异步编程:线程可以用于执行耗时的操作,如I/O操作,而不会阻塞主线程的执行。
4.多线程的挑战
- 竞态条件:多个线程同时访问和修改共享资源可能导致数据不一致和意料之外的结果。
- 死锁:多个线程因为互相等待对方释放资源而陷入无限等待的状态。
- 内存管理:需要小心处理线程间的内存分配和释放,以避免内存泄漏和悬空指针等问题。
二、 线程的创建
创建一个线程就像定义一个函数一样,我们只需要搞清楚创建线程的四个参数:thread,attr,start_routine,arg,分别是什么,怎么用就足够。
#include <pthread.h> //线程函数的头文件int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);thread:线程id,唯一标识一条线程
attr:设置为NULL
start_routine:线程的任务函数
arg:线程任务函数的参数
另外要强调的是:-pthread //使用线程函数时,需要链接这个库!!!
三、线程的取消
其实就是给线程一个取消请求,一般情况下,线程会默认收到取消请求。
int pthread_cancel(pthread_t thread);
四、例程
下面是一个简单的例子,让我们更好的理解线程如何使用:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>// 线程共享全局变量
int g_a = 100;void *task (void *arg)
{while(1){sleep(1);printf("task....%s-->%d\n", (char *)arg, g_a);}
}// main本身就是一个线程
int main(void)
{pthread_t tidA, tidB;// 创建一条新的线程,新的线程所要执行的任务就是task所指向的函数里面的逻辑pthread_create(&tidA, NULL, task, (void *)"A");pthread_create(&tidB, NULL, task, (void *)"B");// task(NULL);while(1){sleep(1);printf("main....\n");g_a++;if(g_a == 110)pthread_cancel(tidA); //给tidA线程发送一个取消请求if(g_a == 115)pthread_cancel(tidB); //给tidB线程发送一个取消请求}return 0;
}

这段C语言代码是一个简单的多线程示例,它展示了如何使用pthread库来创建和管理线程,并演示了线程之间共享全局变量的情况。
-
首先,全局变量
g_a被定义为整数类型并初始化为100。 -
task函数是一个线程的执行体,它通过传递一个参数arg来区分不同的线程。该函数使用无限循环(while循环),每隔一秒打印一次task....并输出线程标识符("A"或"B")以及全局变量g_a的值。 -
main函数是程序的入口,也是主线程。它做了以下事情:- 创建两个新的线程(tidA和tidB),每个线程都执行
task函数。线程tidA被标记为"A",线程tidB被标记为"B",通过传递参数给task函数来区分它们。 - 在主线程中,使用无限循环(while循环)来打印"main....",并且每秒增加全局变量
g_a的值。 - 当全局变量
g_a的值等于110时,主线程发送一个取消请求给线程tidA,使得线程tidA会终止(退出)。 - 当全局变量
g_a的值等于115时,主线程发送一个取消请求给线程tidB,使得线程tidB会终止(退出)。
- 创建两个新的线程(tidA和tidB),每个线程都执行
需要注意的是,取消请求是一种请求终止线程的方式,但并不能保证线程会立即终止,具体是否终止取决于线程的处理逻辑。
更多C语言、Linux系统、ARM板实战和数据结构相关文章,关注专栏:
手撕C语言
玩转linux
脚踢数据结构
6818(ARM)开发板实战
📢写在最后
- 今天的分享就到这啦~
- 觉得博主写的还不错的烦劳
一键三连喔~ - 🎉感谢关注🎉
相关文章:
【手撕C语言】多线程
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,Linux基础,ARM开发板,软件配置等领域博主🌍快上🚘,一起学习,让我们成为一个强大的攻城狮!送给自己和读者的一句鸡汤🤔&…...
Dubbo2-概述
Dubbo 阿里公司开源的一个高性能,轻量级的javaRPC(远程服务调用方案)框架,提供高性能远程调用方案以及SOA服务治理方案 Dubbo架构 节点角色说明: Provider:服务提供方 Container:服务运行容器 Consumer:调用远程服务…...
【将回声引入信号中】在语音或音频文件中引入混响或简单回声,以研究回声延迟和回波幅度对生成的回波信号感知的影响(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
pythonocc进阶学习:投影projection
1.点 到 线,(直线,曲线)等上的投影 staticmethod # 点到Lin的投影 def Project_Pnt_To_Lin(p: gp_Pnt, lin: gp_Lin):Edge BRepBuilderAPI_MakeEdge(lin).Edge()curve BRep_Tool.Curve(Edge)proPnt GeomAPI_ProjectPointOnCurve(p, curve[0])Neares…...
Scractch3.0_Arduino_ESP32_学习随记_显示网络天气(二)
这里写目录标题 目的器材程序联系我们 目的 通过C02获取网络天气。并在屏上显示 器材 硬件: 齐护机器人C02 购买地址 软件: scratch3.0 下载地址:官网下载 程序 使用的是公开免费的API,对请求间隔和次数有限制,如果连续获取可能会被封IPÿ…...
Mysql压力测试(sysbench)
目录 配置项目环境: 参考:采用sysbench压测mysql详解_dream21st的博客-CSDN博客 实验步骤: 1、安装sysbench工具 2、在master上创建用户和库,配置用户的权限可以使他可以访问库(Mysql的主从复制) 3、基…...
TBDS MPP参数列表
TBDS MPP参数列表 namesettingdescriptionapplication_namessqlSets the application name to be reported in statistics and logs.archive_cleanup_commandSets the shell command that will be executed at every restart point.archive_command(disabled)Sets the shell co…...
C# OpenCvSharp 读取rtsp流
效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using Syste…...
每日后端面试5题 第七天
一、内连接和外连接查询有什么区别? 内连接只查询出两表的交集; 外连接会查询出某表的全部与两表的交集。 二、Nginx的作用 1.反向代理 前端把请求发送给nginx,再由nginx将请求发送给后端服务器。 2.负载均衡 提高访问速度;…...
计算机视觉的应用10-图片中的表格结构识别与提取实战
大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用10-图片中的表格结构识别与提取实战,表格结构识别在信息处理领域中具有广泛应用,但由于表格的多样性和复杂性,以及难以准确解析的布局和格式,传统的方…...
P4178 Tree (点分治)
题目链接 一:我们考虑树上两点之间的路径有什么情况 1:经过根节点(即在根节点的两端) 2:不经过根节点(完全在一颗子树的一侧) 二:我们考虑这两种路径是否可以归为一类 1࿱…...
Kubernetes 二进制搭建
Kubernetes 二进制搭建 一、二进制搭建 Kubernetes v1.201.1 部署准备1.2 操作系统初始化配置1.3 部署 etcd 集群1.3.1 etcd 作为服务发现系统,有以下的特点1.3.2 准备签发证书环境1.3.3 在 master01 节点上操作1.3.4 生成证书 1.4 部署 docker引擎1.4.1 部署 Maste…...
QT QtXlsx安装使用
QtXlsx介绍 QtXlsx是一个可以读取和写入Excel文件的库。它不需要Microsoft Excel,可以在Qt5支持的任何平台上使用。 这里一定是需要QT5支持的。 须知安装QtXlsx时,需要下载perl 1.安装perl 这里选择官网下载安装即可。 官网地址:https://p…...
Java医院信息化HIS管理系统源码
HIS模板分为两种:病历模板和报表模板。模板管理是运营管理的核心组成部分,是基层卫生健康云中各医疗机构定制电子病历和报表的地方,各医疗机构可根据自身特点特色定制电子病历和报表,制作的电子病历及报表可直接在业务系统中使用。…...
【Uni-App】uview 开发多端应用,密码显示隐藏功能不生效问题
出现的问题: 使用uview组件u-input框密码绑定时会出现右侧密码显隐图标不显示的问题 思路: 1.看了下uview源码,发现这有一段注释,我们需要把源码修改一下,问题出在这里 这行代码修改为 :password"password || …...
人工智能算法-SVM, KNN
目录 SVM, KNN区别 一、KNN算法概述 算法的描述: 二、关于K的取值 K的取法: 三、关于距离的选取 Euclidean Distance 定义: 四、总结 SVM, KNN区别...
计算机网络—TCP
这里写目录标题 TCP头格式有哪些为什么需要TCP,TCP工作在哪什么是TCP什么是TCP连接如何确定一个TCP连接TCP和UDP的区别,以及场景TCP和UDP能共用一个端口?TCP的建立TCP三次握手过程为什么是三次握手、不是两次、四次why每次建立连接࿰…...
Oracle到DM实时数据同步实施方案
目录 1 项目概述 2 需求分析 3 实施操作 3.1 历史数据全量同步 3.2 增量数据实时同步 4 问题总结 4.1 字符型非空约束 4.2 字符型唯一索引尾部空格 1 项目概述 将Oracle 11g RAC生产环境数据同步到DM8分析环境,Oracle数据库大小1.5T,日增归档10…...
WebRTC | 音视频实时通信的本质
目录 一、音视频实时通信的两种指标 1. 实时通信延迟指标 2. 视频相关的基本概念 3. 音视频服务质量指标 二、解决实时通信的主要矛盾 1. 增加带宽 A. 提供更优质的接入服务 B. 保证云端网络的带宽和质量 C. 更合理的路由调度策略 2. 减少数据量 A. 采用更好的压缩算…...
ApiPost的使用
1. 设计接口 请求参数的介绍 Query:相当于get请求,写的参数在地址栏中可以看到 Body: 相当于 post请求,请求参数不在地址栏中显示。 请求表单类型,用form-data json文件类型,用row 2. 预期响应期望 设置完每一项点一下生成响应…...
告别写放大!手把手教你用Zenfs在ZNS SSD上部署RocksDB(附性能对比与配置脚本)
突破传统SSD性能瓶颈:Zenfs与ZNS SSD的深度实践指南 在当今数据密集型应用爆发的时代,存储系统的性能优化已成为技术团队面临的核心挑战之一。传统SSD虽然提供了比机械硬盘更高的I/O性能,但其内部架构设计却带来了写放大、空间浪费和不可预测…...
SpringBoot+Vue家校互联管理系统源码+论文
代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择: 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...
UE4/UE5委托实战避坑指南:从触发开关灯到跨Actor通信,手把手教你选对类型
UE4/UE5委托实战避坑指南:从触发开关灯到跨Actor通信 在虚幻引擎开发中,委托系统是实现对象间通信的核心机制之一。很多中级开发者在实际项目中都会遇到这样的困惑:明明功能实现了,却在某些情况下出现崩溃或内存泄漏;或…...
Unity Shader 屏幕空间 UVScreen Space UV 完全指南
用裁剪空间坐标除以 w 后重映射到 [0,1],将屏幕纹理"投影"到任意几何体上—— 无需 UV 展开,轻松实现扫描线、水波纹与受击扭曲。1原理:从裁剪空间到屏幕坐标在 GPU 管线中,顶点着色器最终输出的是裁剪空间坐标 clipPos…...
2026年Hermes Agent/OpenClaw如何部署?阿里云及Coding Plan配置保姆级指南
2026年Hermes Agent/OpenClaw如何部署?阿里云及Coding Plan配置保姆级指南。OpenClaw(前身为Clawdbot/Moltbot)作为开源、本地优先的AI助理框架,凭借724小时在线响应、多任务自动化执行、跨平台协同等核心能力,成为个人…...
零成本解锁VMware Workstation Pro 17:从虚拟化新手到专家的完整指南
零成本解锁VMware Workstation Pro 17:从虚拟化新手到专家的完整指南 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major versio…...
用C++手把手教你连接SimNow期货模拟盘(CTP API实战)
从零构建C期货量化交易系统:SimNow模拟盘对接实战指南 为什么选择CTP API进行期货程序化交易开发 在金融科技迅猛发展的今天,程序化交易已成为专业投资者的标配工具。中国期货市场提供的CTP(Comprehensive Transaction Platform)接…...
中国企业海外人才布局成功案例集锦
导读:当前中国企业全球化已从产品出海迈入组织能力与长期价值构建的深水区,在地缘环境、技术迭代与监管变化的多重影响下,企业面临市场适配、跨区域协同、人才稀缺、能力升级、信任构建等多重挑战,海外人才布局成为全球化成败的核…...
机器人控制系统中工控机的选型要点(2026新版)
阿强带你了解机器人控制系统中工控机的选型要点。机器人控制系统是机器人的核心,而工控机又是机器人控制系统的核心。工控机的选型直接决定了机器人控制系统的性能、稳定性和可靠性。很多人在选型的时候,往往只关注处理器的主频和核心数,忽略…...
AI超级员工选型:2026年5款高性价比工具实测解析
2026年,人工智能已从大型企业的技术专属,变为中小企业降本增效、突破增长瓶颈的核心生产力。行业实测数据显示,完成AI超级员工系统部署的中小企业,平均获客成本降低60%,运营效率提升120%,整体投入仅为传统人…...
