【手撕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. 预期响应期望 设置完每一项点一下生成响应…...
从IPv4到IPv6:在华为eNSP上迁移静态路由配置,你需要知道的几个关键差异点
从IPv4到IPv6:华为eNSP静态路由迁移实战指南 如果你已经熟练掌握了华为设备上IPv4静态路由的配置,第一次在eNSP中配置IPv6静态路由时,可能会感到既熟悉又陌生。就像一位习惯右手写字的人突然尝试用左手——基础原理相通,但具体操作…...
微信小程序上传图片到Java/PHP/Node.js后端:chooseMedia选图+Base64编码+接口联调避坑指南
微信小程序图片上传全链路实战:从chooseMedia到多后端处理 在移动应用开发中,图片上传是一个看似简单却暗藏玄机的功能点。微信小程序作为轻量级应用平台,其图片上传机制经历了多次迭代,从早期的wx.chooseImage到现在的wx.chooseM…...
你的知识库是‘熔炉’还是‘沙拉碗’?用Obsidian和Logseq构建个人动态知识体系
你的知识库是‘熔炉’还是‘沙拉碗’?用Obsidian和Logseq构建个人动态知识体系 1. 知识管理的范式转移:从静态熔炉到动态沙拉碗 在传统知识管理体系中,我们习惯于将信息塑造成单一、权威的"熔炉"——所有材料被高温熔解,…...
CXL-PNM架构:突破大语言模型KV缓存内存限制
1. 技术背景与挑战解析在当今大语言模型(LLM)快速发展的背景下,上下文窗口的扩展已成为提升模型性能的关键路径。从最初的几千token发展到如今的百万token量级,这种增长带来了前所未有的技术挑战。让我们先解剖这个问题的核心维度:1.1 KV缓存…...
浏览器端CNN开发实战:TensorFlow.js入门指南
1. 网页端构建卷积神经网络的必要性十年前我第一次接触深度学习时,光是配置TensorFlow环境就花了整整三天。现在打开浏览器就能跑神经网络,这种技术进步让每个想入门AI的人都该感到庆幸。网页端CNN开发最大的优势在于零环境配置——不需要安装CUDA驱动&a…...
我的WINPE使用历史
不知道为何,家里机器理想小新AIR I3,一个GPDWIN一代(袖珍windows游戏机,可以用hdmi输出到电视上),稍微电量差点,在“完全”版WIN10下,就带不动,直接关机或者重启…...
Web 品质样式表:构建高效、美观的网页设计指南
Web 品质样式表:构建高效、美观的网页设计指南 引言 在互联网时代,网页设计已经成为展示企业品牌形象、提供优质用户体验的重要途径。而Web品质样式表(CSS)作为网页设计中的核心组成部分,对于提升网页的整体质量和用户体验至关重要。本文将深入探讨Web品质样式表的重要性…...
别再只会按AutoSet了!手把手教你玩转泰克MSO2000B示波器的触发与采样设置
别再只会按AutoSet了!手把手教你玩转泰克MSO2000B示波器的触发与采样设置 当示波器屏幕上突然出现一个转瞬即逝的毛刺信号,或是测量一个非周期性的复杂波形时,按下AutoSet键往往只能得到一片混乱的显示。这不是示波器的故障,而是自…...
Pearcleaner:为你的Mac来一次彻底的数字大扫除
Pearcleaner:为你的Mac来一次彻底的数字大扫除 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经疑惑过,为什么删除了一个应…...
GEO从入门到精通:第3章 意图词研究
第3章 意图词研究本章导语做GEO,很多团队一开始就急着发内容。账号开了,文章写了,FAQ补了,案例也上了,过一段时间回头看,品牌还是没有稳定进入答案。问题往往出在起点。用户真正会问什么,没有研…...
