【手撕C语言】多线程

news2025/2/24 7:19:54
  • (꒪ꇴ꒪ ),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库来创建和管理线程,并演示了线程之间共享全局变量的情况。

  1. 首先,全局变量g_a被定义为整数类型并初始化为100。

  2. task函数是一个线程的执行体,它通过传递一个参数arg来区分不同的线程。该函数使用无限循环(while循环),每隔一秒打印一次task....并输出线程标识符("A"或"B")以及全局变量g_a的值。

  3. main函数是程序的入口,也是主线程。它做了以下事情:

    • 创建两个新的线程(tidA和tidB),每个线程都执行task函数。线程tidA被标记为"A",线程tidB被标记为"B",通过传递参数给task函数来区分它们。
    • 在主线程中,使用无限循环(while循环)来打印"main....",并且每秒增加全局变量g_a的值。
    • 当全局变量g_a的值等于110时,主线程发送一个取消请求给线程tidA,使得线程tidA会终止(退出)。
    • 当全局变量g_a的值等于115时,主线程发送一个取消请求给线程tidB,使得线程tidB会终止(退出)。

        需要注意的是,取消请求是一种请求终止线程的方式,但并不能保证线程会立即终止,具体是否终止取决于线程的处理逻辑。

        更多C语言Linux系统ARM板实战数据结构相关文章,关注专栏:

   手撕C语言

            玩转linux

                    脚踢数据结构

                            6818(ARM)开发板实战

📢写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 🎉感谢关注🎉

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

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

相关文章

Qt-QSlider样式

文章目录 QSliderQSS 代码QSlider 分析QSlider The slider is the classic widget for controlling a bounded value.It lets the user move a slider handle along a horizontal or vertical groove and translates the handles position into an integer value within the l…

Java课题笔记~ AspectJ 的开发环境(掌握)

AspectJ 的开发环境(掌握) &#xff08;1&#xff09; maven 依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></depe…

简单动态字符串 sds

Redis 设计了简单动态字符串&#xff08;Simple Dynamic String&#xff0c;SDS&#xff09;的结构&#xff0c;用来表示 字符串。相比于 C 语言中的字符串实现&#xff0c;SDS 这种字符串的实现方式&#xff0c;会提升字符串的操 作效率&#xff0c;并且可以用来保存二进制数据…

Element-Plus DatePicker获取时间戳

文章目录 0、先上答案1、渔&#xff1f;1-1 Element-Plus 官网1-2 溯源 Day.js 0、先上答案 <!-- 秒 --><el-date-pickerv-model"timeStamp"type"datetime"value-format"X"/><!-- 毫秒 --><el-date-pickerv-model"tim…

Spring Boot 最佳实践

本文翻译自国外论坛 medium&#xff0c;原文地址&#xff1a;https://medium.com/raviyasas/spring-boot-best-practices-for-developers-3f3bdffa0090 Spring Boot 是一种广泛使用且非常流行的企业级高性能框架。以下是一些最佳实践和一些技巧&#xff0c;我们可以使用它们来…

【Git分布式版本控制系统一】你还不会用Git进行项目管理?

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; 前言 众所周知&#xff0c;分布式版本控制系统git是工作以后进行项目管理必不可少的工具&#xff0c;我将繁杂的命令进行了归类整理和总结&#xff0c;供大家参考学习…

springboot+vue真实项目部署详细步骤

sprinbootvue项目详细部署步骤 文章目录 sprinbootvue项目详细部署步骤1、准备部署文件2、安装mysql2.1、配置mysql2.2、用navicat远程连接mysql导入数据2.3、导入mysql数据 3、安装jdk4、安装nginx5、安装redis6、创建对应的目录层级和启动6.1 构建启动脚本6.2 、修改两个后台…

数据库索引的使用

1、MySQL的基本架构 架构图 左边的client可以看成是客户端&#xff0c;客户端有很多&#xff0c;像我们经常你使用的CMD黑窗口&#xff0c;像我们经常用于学习的WorkBench&#xff0c;像企业经常使用的Navicat工具&#xff0c;它们都是一个客户端。右边的这一大堆都可以看成是…

Python系统学习1-5-容器

1、字符串 字符串是不可变的数据 原因&#xff1a;如果在原有内存中修改&#xff0c;很可能破坏其他数据的空间 现象&#xff1a;每次需要修改字符串时&#xff0c;都会创建新数据&#xff0c;替换变量中存储的地址 字符串字面值 (1)建议使用双引号 name01 "悟空&q…

中介者模式(C++)

定义 用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖)&#xff0c;从而使其耦合松散(管理变化)&#xff0c;而且可以独立地改变它们之间的交互。 应用场景 在软件构建过程中&#xff0c;经常会出现多个对象…

VUE框架:vue2转vue3全面细节总结(5)过渡动效

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

公文写作素材:“干”字型排比句40例

1.怀着真诚“想干”&#xff0c;扛着担当“敢干”&#xff0c;瞄着路径“能干”&#xff0c;盯着责任“真干”&#xff0c;想着办法“会干”&#xff0c;带着智慧“巧干”&#xff0c;揣着情怀“认干”&#xff0c;铆着劲头“实干”。 2.脱下“皮鞋”、换上“运动鞋”&#xff…

3 vue的if语法

vue的if语法是相当于一个标签的属性来写进去的&#xff0c;比如说<h1 v-if“”>。要注意的是if语句里可以自动从数据层取值的&#xff0c;比如<h1 v-if"message">&#xff0c;这里就会自动把key为message的值取过来&#xff0c;而如果要传一个字符串&…

Vue [Day5]

自定义指令 全局注册 和 局部注册 inserted在指令所在的元素 被插入到页面中时&#xff0c;触发 main.js import Vue from vue import App from ./App.vueVue.config.productionTip false// 1.全局注册指令 Vue.directive(focus, {// inserted在指令所在的元素 被插入到页…

Java个人博客系统--基于Springboot的设计与实现

目录 一、项目概述 应用技术 接口实现&#xff1a; 数据库定义&#xff1a; 数据库建表&#xff1a; 博客表数据库相关操作&#xff1a; 添加项⽬公共模块 加密MD5 页面展示&#xff1a;http://121.41.168.121:8080/blog_login.html 项目源码&#xff1a;https://gitee…

初学 Python 需要安装哪些软件?超级实用,小白必看!

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 编程这个东西是真的奇妙。 对于懂得的人来说&#xff0c;会觉得这个工具是多么的好用、有趣&#xff0c;而对于小白来说&#xff0c;就如同大山一样。 其实这个都可以理解&#xff0c;大家都是这样过来的。 那么接下来就说…

Spring简述

Sping是什么Spring主要模块IOCDI依赖注入的三种方式 AOP术语 Sping是什么 Spring是一个轻量级的开源框架&#xff0c;主要作用是为了简化开发&#xff0c;它以IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;为内核 Spring主要模块 我们一般…

cocosCreator 之 i18n多语言插件

版本&#xff1a; v3.4.0 环境&#xff1a; Mac 简介 i18n是国际化的简称&#xff0c; 全名&#xff1a;internationalization&#xff1b;取首尾字符i和n&#xff0c;18代表单词中间的字符数目。 该插件不需要产品做太多的改变&#xff0c;通过语言的设置&#xff0c;实现不…

P1194 买礼物(最小生成树)(内附封面)

买礼物 题目描述 又到了一年一度的明明生日了&#xff0c;明明想要买 B B B 样东西&#xff0c;巧的是&#xff0c;这 B B B 样东西价格都是 A A A 元。 但是&#xff0c;商店老板说最近有促销活动&#xff0c;也就是&#xff1a; 如果你买了第 I I I 样东西&#xff0…

【逗老师的PMP学习笔记】6、项目的进度管理

目录 一、规划进度管理1、【关键输出 】进度管理计划 二、定义活动1、【关键工具】拆解2、【关键工具】滚动式规划3、【关键输出】活动清单和活动属性4、【关键输出】里程碑清单 三、排列活动顺序1、【关键工具】紧前关系绘图法2、【关键工具】提前量和滞后量3、【关键输出】项…