线程间的通信

一、实现方式

        各线程之间栈区独享、并且与进程共享文本段、数据段、堆区,所以可以通过全局变量实现多线程间通信。

int num = 0;                                          //创建一个全局变量void *thread1(void *arg)
{while (1){num = 100;                                    //线程一中给全局变量num赋值100}return NULL;
}void *thread2(void *arg)
{while (1){printf("num = %d\n",num);                     
//由于多个线程之间共享进程的全局变量,所以当线程一运行后,线程二打印的结果num = 100;
//但由于线程之间宏观并行,运行的先后顺序不确定,所以会存在线程二先与运行的情况,当线程二先运行,这里打印结果是num = 0                                                   }return NULL;
}int main(int argc, const char **argv)
{pthread_t tid1;pthread_t tid2;pthread_create(&tid1, NULL, thread1, NULL);pthread_create(&tid2, NULL, thread2, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);return 0;
}

 线程1先执行,线程2后执行的打印情况(线程间的通讯)

二、锁

1、互斥锁

(1)概念

为了防止多线程操作全局变量带来的资源竞争,需要引入互斥锁的概念

 (2)互斥锁函数接口

man 3 pthread_mutex_init

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

                                   const pthread_mutexattr_t *restrict attr);

功能:

        互斥锁的初始化,锁的初始化得放在线程创建之前

参数:

        mutex:互斥锁的首地址,pthread_nutex_t  lock;(得是全局变量),所有线程共用一把锁

        attr:属性,默认为NULL

返回值:

        成功返回0

        失败返回错误码

man 3 pthread_mutex_lock

int pthread_mutex_lock(pthread_mutex_t *mutex);

功能:

        加锁

int pthread_mutex_unlock(pthread_mutex_t *mutex);

功能:

        解锁

int pthread_mutex_destroy(pthread_mutex_t *mutex);

功能:

        销毁互斥锁 ,锁的销毁得放在线程回收之后

两个都不锁 

int num = 0;void *thread1(void *arg)
{while (1){num = 100;}return NULL;
}void *thread2(void *arg)
{while (1){num = 200;printf("%d\n",num);//线程之间宏观并行,微观串行;所以线程在执行的过程中,会出现以下情况://情况一:线程1先执行,线程二后执行//情况二:线程2先执行,线程1后执行//情况三:线程2执行一半后执行线程1,线程1执行一半后执行线程2,即二者交叉执行//所以这里的打印结果是不确定的}return NULL;
}int main(int argc, const char **argv)
{pthread_t tid1;pthread_t tid2;pthread_create(&tid1, NULL, thread1, NULL);pthread_create(&tid2, NULL, thread2, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);return 0;
}

 打印结果:

锁一个 

int num = 0;
pthread_mutex_t lock;void *thread1(void *arg)
{while (1){num = 100;}return NULL;
}void *thread2(void *arg)
{while (1){//锁一个不行,另一个没锁住还是会干扰到被锁住的线程的执行,两个都锁住才能避免冲突//当两个都锁住后,一个执行完毕不代表另一个会一定接着执行,有可能还会执行第二遍刚执行完毕的线程pthread_mutex_lock(&lock);num = 200;printf("num = %d\n", num);pthread_mutex_unlock(&lock);}return NULL;
}int main(int argc, const char **argv)
{pthread_t tid1;pthread_t tid2;pthread_mutex_init(&lock, NULL);pthread_create(&tid1, NULL, thread1, NULL);pthread_create(&tid2, NULL, thread2, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);pthread_mutex_destroy(&lock);return 0;
}

 打印结果:

锁两个 

int num = 0;
pthread_mutex_t lock;void *thread1(void *arg)
{while (1){pthread_mutex_lock(&lock);num = 100;pthread_mutex_unlock(&lock);}return NULL;
}void *thread2(void *arg)
{while (1){pthread_mutex_lock(&lock);num = 200;printf("num = %d\n", num);pthread_mutex_unlock(&lock);}return NULL;
}int main(int argc, const char **argv)
{pthread_t tid1;pthread_t tid2;pthread_mutex_init(&lock, NULL);pthread_create(&tid1, NULL, thread1, NULL);pthread_create(&tid2, NULL, thread2, NULL);pthread_join(tid1, NULL);pthread_join(tid2, NULL);pthread_mutex_destroy(&lock);return 0;}

执行结果

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

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

相关文章

Deepseek开源周第四天:从 DualPipe 到 EPLB

Deepseek开源周第四天:从 DualPipe 到 EPLB 前言 上周deepseek宣布,将在本周陆续发布五个开源项目,这些库已经在生产环境中经过了记录、部署和实战测试。 今天是deepseek开源周的第四天,deepseek发布了三个开源项目,…

字符函数和字符串函数1

1、字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h 在这里介绍一下islower函数,其他的非常相似。 函数原型: 1 int islower(int c); islo…

算法系列之排序算法-堆排序

在数据结构中,堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列。堆分为最大堆和最小堆两种类型。最大堆的每个节点的值都大于或等于其子节点的值,而最小堆的每个节点的值都小于或等于其子节点的值。Java 提供了…

Mercury、LLaDA 扩散大语言模型

LLaDA 参考: https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在线demo: https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在线demo: https://chat.inceptionlabs.ai/ 速度很快生成

YOLO - pose detect 输入输出接口与执行效率测试

0.参考资料: Pose - Ultralytics YOLO Docs 下面仅对这个模型的输入输出接口和效率做了判断,尚不涉及训练。 pose和segment 相对class detect是相对自然的扩展。object box内部的 subclass就是seg,object box 内部的point array 就是Pose。…

DeepSeek 开源狂欢周(一)FlashMLA:高效推理加速新时代

上周末,DeepSeek在X平台(Twitter)宣布将开启连续一周的开源,整个开源社区为之沸腾,全球AI爱好者纷纷为关注。没错,这是一场由DeepSeek引领的开源盛宴,推翻了传统推理加速的种种限制。这周一&…

MySQL数据库基本概念

目录 什么是数据库 从软件角度出发 从网络角度出发 MySQL数据库的client端和sever端进程 mysql的client端进程连接sever端进程 mysql配置文件 MySql存储引擎 MySQL的sql语句的分类 数据库 库的操作 创建数据库 不同校验规则对查询的数据的影响 不区分大小写 区…

【洛谷贪心算法】P1106删数问题

这道题可以使用贪心算法来解决,核心思路是尽量让高位的数字尽可能小。当我们逐步删除数字时,会优先删除高位中相对较大的数字。具体做法是从左到右遍历数字序列,当发现当前数字比它后面的数字大时,就删除当前数字,直到…

【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目

解决idea至少创建jdk17项目 问题 idea现在只能创建最少jdk17,不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17,不能创建java8了吗 我本来以为是 IDEA 版本更新导致的 Bug,开始还没在意。 直到我今天自己初始化项目时才发现&am…

MyBatis 操作数据库(详细入门详细)

本章⽬标 1. 使⽤MyBatis完成简单的增删改查操作, 参数传递. 2. 掌握MyBatis的两种写法: 注解 和 XML⽅式 3. 掌握MyBatis 相关的⽇志配置 铺垫 在应⽤分层学习时, 我们了解到web应⽤程序⼀般分为三层,即:Controller、Service、Dao . 之前的案例中…

C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布

C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布 MQTT简述MQTTNet简述创建项目(基于.NET Framework框架)安装MQTTNet库项目源码运行效果 MQTT简述 mqtt官网 MQTTNet简述 MQTTnet MQTTnet 是一个强大的开源 MQTT 客户端库&#…

武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司举行校企联培座谈会

2025年2月21日下午,武汉大学生命科学学院与谱度众合(武汉)生命科技有限公司(以下简称“谱度众合”)在学院学术厅举行校企联培专业学位研究生合作交流会。武汉大学生命科学学院副院长刘星教授、生命科学学院周宇教授、产…

【JSON2WEB】15 银河麒麟操作系统下部署JSON2WEB

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

Redis 持久化方式:RDB(Redis Database)和 AOF(Append Only File)

本部分内容是关于博主在学习 Redis 时关于持久化部分的记录,介绍了 RDB 和 AOF 两种持久化方式,详细介绍了持久化的原理、配置、使用方式、优缺点和使用场景。并对两种持久化方式做了对比。文章最后介绍了 Redis 持久化的意义并与其他常见的缓存技术做了…

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】

华为云之使用鲲鹏弹性云服务器部署Node.js环境【玩转华为云】 一、本次实践介绍1.1 实践环境简介1.3 本次实践完成目标 二、 相关服务介绍2.1 华为云ECS云服务器介绍2.2 Node.js介绍 三、环境准备工作3.1 预置实验环境3.2 查看预置环境信息 四、登录华为云4.1 登录华为云4.2 查…

《Python实战进阶》No 7: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战

第7集: 一个AI大模型聊天室的构建-基于WebSocket 实时通信开发实战 在现代 Web 开发中,实时通信已经成为许多应用的核心需求。无论是聊天应用、股票行情推送,还是多人协作工具,WebSocket 都是实现高效实时通信的最佳选择之一。本…

(转)Java单例模式(1)

l单例模式的好多:节约了内存,提高了代码的执行效率。

【PCIe 总线及设备入门学习专栏 1.2 -- 访问 PCIe 设备过程】

文章目录 OverviewPCIe 系统软件层次TLP 通用格式配置过程PCIe 设备配置寄存器Type0 Configuration Request配置过程Overview 对于PCIe 设备来说,它与桥的连接直通过两条差分信号,那么当桥下面接入多个PCIe 设备时,它是如何选中某个设备的呢?我面前面一篇文件介绍了 PCI设…

HarmonyOS NEXT组件深度全解:十大核心组件开发指南与实战

文章目录 引言:组件化开发的未来趋势第一章:基础UI组件精要1.1 Button:交互设计的基石1.1.1 多态按钮实现1.1.2 高级特性 1.2 Text:文字渲染的进阶技巧1.2.1 富文本混排1.2.2 性能优化 第二章:布局组件深度解析2.1 Fle…

win11编译pytorch cuda128版本流程

Geforce 50xx系显卡最低支持cuda128,torch cu128 release版本目前还没有释放,所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022,工作负荷选择【使用c的桌面开发】,安装完成后将…