进程线程的通信-day5

1、将互斥机制的代码实现重新敲一遍。

#include<myhead.h>//临界资源
int num=520;//1、创建一个互斥锁变量
pthread_mutex_t mutex;void *task1(void *arg);
void *task2(void *arg);
int main(int argc, const char *argv[])
{//2、初始化互斥锁pthread_mutex_init(&mutex,NULL);//定义线程pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return 0;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create error\n");return 0;}//获取tid号printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);//回收线程资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//5、摧毁锁资源pthread_mutex_destroy(&mutex);return 0;
}
//任务1函数
void *task1(void *arg)
{//3、获取锁资源pthread_mutex_lock(&mutex);num = 1314;sleep(3);printf("task1:num=%d\n",num);//4、释放锁资源pthread_mutex_unlock(&mutex);
}
//任务2函数
void *task2(void *arg)
{//3、获取锁资源pthread_mutex_lock(&mutex);num ++;sleep(1);printf("task2:num=%d\n",num);//4、释放锁资源pthread_mutex_unlock(&mutex);
}


2、将无名信号量的代码实现重新敲一遍。

#include<myhead.h>//1、创建无名信号量
sem_t sem;void *task1(void *arg);
void *task2(void *arg);
int main(int argc, const char *argv[])
{//2、初始化无名信号量sem_init(&sem,0,0);//定义线程pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return 0;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create error\n");return 0;}//获取tid号printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);//回收线程资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//5、释放无名信号量sem_destroy(&sem);return 0;
}
//任务1函数
void *task1(void *arg)
{int num=5;while(num--){sleep(1);puts("我生产一辆特斯拉");//4、释放资源sem_post(&sem);}pthread_exit(NULL);
}
//任务2函数
void *task2(void *arg)
{int num=5;while(num--){//3、申请资源sem_wait(&sem);puts("我买了一辆特斯拉");}pthread_exit(NULL);
}


3、将条件变量的代码实现重新敲一遍。

#include<myhead.h>//1、定义条件变量
pthread_cond_t cond;//11、定义互斥锁变量
pthread_mutex_t mutex;void *task1(void *arg);
void *task2(void *arg);
int main(int argc, const char *argv[])
{//2、初始化条件变量pthread_cond_init(&cond,NULL);//22、初始化互斥锁pthread_mutex_init(&mutex,NULL);//定义线程pthread_t tid1,tid2,tid3,tid4,tid5,tid6;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("tid1 create error\n");return 0;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("tid2 create error\n");return 0;}if(pthread_create(&tid3,NULL,task2,NULL)!=0){printf("tid3 create error\n");return 0;}if(pthread_create(&tid4,NULL,task2,NULL)!=0){printf("tid4 create error\n");return 0;}if(pthread_create(&tid5,NULL,task2,NULL)!=0){printf("tid5 create error\n");return 0;}if(pthread_create(&tid6,NULL,task2,NULL)!=0){printf("tid6 create error\n");return 0;}printf("tid1:%#lx,tid2:%#lx,tid3:%#lx,tid4:%#lx,tid5:%#lx,tid6:%#lx\n",\tid1,tid2,tid3,tid4,tid5,tid6);//回收线程资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);pthread_join(tid4,NULL);pthread_join(tid5,NULL);pthread_join(tid6,NULL);//5、摧毁条件变量pthread_cond_destroy(&cond);//55、摧毁互斥锁pthread_mutex_destroy(&mutex);return 0;
}
//定义生产者函数
void *task1(void *arg)
{int num=5;while(num--){sleep(1);printf("%#lx:生产了一辆特斯拉\n",pthread_self());//3、唤醒一个消费者pthread_cond_signal(&cond);}pthread_exit(NULL);
}
//定义消费者函数
void *task2(void *arg)
{//33、上锁pthread_mutex_lock(&mutex);//4、进入等待队列pthread_cond_wait(&cond,&mutex);printf("%#lx:购买了一辆特斯拉\n",pthread_self());//4、解锁pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}


4、将无名管道的代码实现重新敲一遍。

#include<myhead.h>
//管道进程传输
int main(int argc, const char *argv[])
{//创建管道文件int pipefd[2]={0};if(pipe(pipefd)==-1){perror("pipe error");return -1;}printf("pipefd[0]=%d,pipefd[1]=%d\n",pipefd[0]),pipefd[1];//创建子进程pid_t pid=fork();if(pid>0){//父进程//关闭管道读端close(pipefd[0]);char wbuf[128]="";while(1){//清空wbuf数组bzero(wbuf,sizeof(wbuf));//终端输入数据fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]='\0';//将数据写入管道文件中write(pipefd[1],wbuf,strlen(wbuf));//输入结束条件if(strcmp(wbuf,"quit")==0)break;}//关闭管道写端close(pipefd[1]);//阻塞回收子进程资源wait(NULL);}else if(pid == 0){//子进程//关闭管道写端close(pipefd[1]);char rbuf[128]="";while(1){//清空rbuf内容bzero(rbuf,sizeof(rbuf));//从管道文件中读取数据read(pipefd[0],rbuf,sizeof(rbuf));//输出rbuf的数据printf("父进程传来的数据为:%s\n",rbuf);//读取结束条件if(strcmp(rbuf,"quit")==0)break;}//关闭管道读端close(pipefd[0]);exit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}


5、将有名管道的代码实现重新敲一遍。

#include<myhead.h>
int main(int argc, const char *argv[])
{//创建一个管道文件if(mkfifo("./myfifo",0664)==-1){perror("mkfifo error");return -1;}//阻塞getchar();//清楚文件system("rm myfifo");return 0;
}
#include<myhead.h>
int main(int argc, const char *argv[])
{//打开管道文件int wfd=-1;//以只写的形式打开文件if((wfd=open("./myfifo",O_WRONLY))==-1){perror("open error");return -1;}//定义容器char wbuf[128]="";while(1){printf("please enter>>>");fgets(wbuf,sizeof(wbuf),stdin);//把'\n'变为'\0'wbuf[strlen(wbuf)-1]='\0';//数据写入管道write(wfd,wbuf,strlen(wbuf));//终端输入结束条件if(strcmp(wbuf,"quit")==0)break;}//关闭文件close(wfd);return 0;
}
#include<myhead.h>
int main(int argc, const char *argv[])
{//打开管道文件int rfd=-1;//以只读形式打开文件if((rfd = open("./myfifo",O_RDONLY))==-1){perror("open error");return -1;}//定义容器char rbuf[128]="";while(1){//清空rbuf数组bzero(rbuf,sizeof(rbuf));//读取管道文件的数据read(rfd,rbuf,sizeof(rbuf));//输出结果printf("收到的数据为:%s\n",rbuf);//读取结束条件if(strcmp(rbuf,"quit")==0)break;}//关闭文件close(rfd);return 0;
}


6、使用有名管道完成两个进程的相互通信(提示:可以使用多进程或多线程完成)。

//管道创建函数
#include<myhead.h>
int main(int argc, const char *argv[])
{//创建二个管道文件if(mkfifo("./text1",0664)==-1){perror("text1 error");return -1;}if(mkfifo("./text2",0664)==-1){perror("text2 error");return -1;}//阻塞getchar();//清楚文件system("rm text1");system("rm text2");return 0;
}
//用户1发送和接受函数
#include<myhead.h>
int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){//打开管道文件int wfd=-1;//以只写的形式打开文件if((wfd=open("./text1",O_WRONLY))==-1){perror("open error");return -1;}//定义容器char wbuf[128]="";while(1){printf("please enter>>>");fgets(wbuf,sizeof(wbuf),stdin);//把'\n'变为'\0'wbuf[strlen(wbuf)-1]='\0';//数据写入管道write(wfd,wbuf,strlen(wbuf));//终端输入结束条件if(strcmp(wbuf,"quit")==0)break;}//关闭文件close(wfd);		//打开管道文件}else if(pid==0){//打开管道文件int rfd=-1;//以只读形式打开文件if((rfd = open("./text2",O_RDONLY))==-1){perror("open error");return -1;}//定义容器char rbuf[128]="";while(1){//清空rbuf数组bzero(rbuf,sizeof(rbuf));//读取管道文件的数据read(rfd,rbuf,sizeof(rbuf));//输出结果printf("收到的数据为:%s\n",rbuf);//读取结束条件if(strcmp(rbuf,"quit")==0)break;}//关闭文件close(rfd);}else {perror("fork error");return -1;}return 0;
}
//用户2发送接受函数
#include<myhead.h>
int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){//打开管道文件int rfd=-1;//以只读形式打开文件if((rfd = open("./text1",O_RDONLY))==-1){perror("open error");return -1;}//定义容器char rbuf[128]="";while(1){//清空rbuf数组bzero(rbuf,sizeof(rbuf));//读取管道文件的数据read(rfd,rbuf,sizeof(rbuf));//输出结果printf("收到的数据为:%s\n",rbuf);//读取管道文件的数据取结束条件if(strcmp(rbuf,"quit")==0)break;}//关闭文件close(rfd);}else if(pid==0){	//打开管道文件int wfd=-1;//以只写的形式打开文件if((wfd=open("./text2",O_WRONLY))==-1){perror("open error");return -1;}//定义容器char wbuf[128]="";while(1){printf("please enter>>>");fgets(wbuf,sizeof(wbuf),stdin);//把'\n'变为'\0'wbuf[strlen(wbuf)-1]='\0';//数据写入管道write(wfd,wbuf,strlen(wbuf));//终端输入结束条件if(strcmp(wbuf,"quit")==0)break;}//关闭文件close(wfd);}else {perror("fork error");return -1;}return 0;
}

7、思维导图

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

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

相关文章

Shiro-14-subject 主体

理解Apache Shiro中的主题 毫无疑问&#xff0c;Apache Shiro中最重要的概念是主题。 “主题”只是一个安全术语&#xff0c;它指的是应用程序用户特定于安全的“视图”。Shiro主题实例代表了单个应用程序用户的安全状态和操作。 这些操作包括: 身份验证(登录) 授权(访问控…

了解JSON的作用及其方法

什么是json JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式采用完全独立编程语言的文本格式存储和表示数据&#xff08;就是字符串&#xff09;。它基于JavaScript语法&#xff0c;但可以被多种编程语言使用和解析。JSON以键值对的形式存…

高光谱图像降噪方法(2D Wavelet, 3D Wavelet, FORPDN, HyRes等方法)

近年来&#xff0c;随着遥感应用的不断深入&#xff0c;高光谱图像研究已经成为遥感领域发展最迅速的技术之一。与其他传统成像技术相比&#xff0c;高光谱图像具有更多优势&#xff1a;更丰富的信息量、纳米级的光谱分辨率以及范围更广且连续的光谱。因此&#xff0c;在农业、…

选择VR全景行业,需要了解哪些内容?

近年来&#xff0c;随着虚拟现实、增强现实等技术的持续发展&#xff0c;VR全景消费市场得以稳步扩张。其次&#xff0c;元宇宙行业的高速发展&#xff0c;也在进一步拉动VR全景技术的持续进步&#xff0c;带动VR产业的高质量发展。作为一种战略性的新兴产业&#xff0c;国家和…

OJ_学生信息系统

题干 输入样例&#xff1a; 5 zhaoyi 70 80 90 240 qianer 65 32 77 174 sunsan 100 55 68 223 lisi 86 77 90 253 wangwu 100 59 66 225 输出样例&#xff1a; *[qianer] 65 32 77 *[sunsan] 100 55 68 *[wangwu] 100 59 66 lisi 86 77 90 zhaoyi 70 80 90 wangwu 100 59 6…

云打印api搭建,云打印api怎么对接?

相信近来一段时间云打印概念的火热让很多企业和App都有开展打印业务的想法&#xff0c;但是云打印技术的开发又需要有打印设备的支持&#xff0c;这个时候我们可以找到专业的云打印服务平台进行api对接。那么云打印api搭建&#xff0c;云打印api怎么对接&#xff1f;今天来一起…

C语言自定义类型:结构体的使用及其内存对齐【超详细建议点赞收藏】

目录 1. 结构体类型的声明1.1 结构的声明1.2 结构体变量的创建和初始化1.3 结构的特殊声明---匿名结构体1.4 结构的自引用 2.结构体内存对齐&#xff08;重点&#xff01;&#xff01;&#xff09;2.1 对齐规则2.2 例题讲解2.3 为什么存在内存对齐&#xff1f;2.4 修改默认对齐…

OpenGauss数据库本地搭建并结合内网穿透实现远程访问

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…

云渲染农场服务给力吗?全天候不间断服务如何保障?

近年来&#xff0c;云渲染农场以其强大的计算能力和高效的渲染速度而闻名&#xff0c;为各行各业的视觉创作提供了不可或缺的支持。但是&#xff0c;人们普遍关心的是&#xff0c;云渲染农场服务是否真的给力&#xff1f;全天候的服务又是如何保障呢&#xff1f; 实际上&#…

用Python插入页码到PDF文档

页码是许多类型文件中的重要内容&#xff0c;它能方便读者在文档中的导航。在创建PDF文档时&#xff0c;添加页码对于组织和引用内容特别有用。在本文中&#xff0c;我们将探讨如何利用Python程序高效地插入页码到PDF文档中&#xff0c;简化工作流程并创建出精美、结构合理的PD…

【JavaEE】_synchronized关键字——监视器锁monitor lock

目录 1. synchronized的特性 2. synchronized的使用 3. Java标准库中的线程安全类 1. synchronized的特性 &#xff08;1&#xff09;互斥&#xff1a; 前文已经介绍&#xff0c;某个线程执行到某个对象的synchronized中时&#xff0c;其他线程如果也执行到同一个对象&…

2024 Sora来了!“手机Agent智能体”也来了!

近日&#xff0c;Open AI发布了能够根据文本生成超现实视频的工具Sora&#xff0c;多款震撼视频引爆科技圈刷屏&#xff0c;热度持续发酵占据AI领域话题中心&#xff0c;被认为是AGI实现过程里的重大里程碑事件。新一轮的人工智能浪潮给人类未来的生产和生活方式带来巨大而深远…

VPN | 世界那么大,我想“魔法”上网看看,可以吗?

Hi&#xff0c;大家好&#xff0c;我是半亩花海。世界那么大&#xff0c;我想“魔法”上网看看&#xff0c;可以吗&#xff1f;随着网络的发展与普及&#xff0c;畅游网络世界已成为人们生活的一部分。它给我们开拓了视野&#xff0c;增长了见闻&#xff0c;丰富了知识&#xf…

FISCO BCOS(二)———配置及使用控制台

一、前言 FISCO BCOS是由金融区块链合作联盟&#xff08;深圳&#xff09;与微众银行共同发起的开源区块链项目&#xff0c;支持多链多账本&#xff0c;满足金融行业复杂业务需求。本文将介绍如何在Ubuntu操作系统上使用Linux命令配置FISCO BCOS的控制台并进行get/set操作。 目…

React 模态框的设计(一)拖动组件的设计

春节终结束了&#xff0c;忙得我头疼。终于有时间弄自己的东西了。今天来写一个关于拖动的实例讲解。先看效果&#xff1a; 这是一个简单的组件设计&#xff0c;如果用原生的js设计就很简单&#xff0c;但在React中有些事件必须要多考虑一些。这是一个系列的文章&#xff0c;…

YOLOv9来咧!

文章目录 论文:主要内容一、提出使用PGI&#xff08;Programmable Gradient Information&#xff0c;可编程梯度信息&#xff09;来解决信息瓶颈问题和深度监督机制不适合轻量级神经网络的问题。二、设计了GELAN&#xff08;Generalized ELAN &#xff0c;广义ELAN&#xff09;…

LLM 模型融合实践指南:低成本构建高性能语言模型

编者按&#xff1a;随着大语言模型技术的快速发展&#xff0c;模型融合成为一种低成本但高性能的模型构建新途径。本文作者 Maxime Labonne 利用 mergekit 库探索了四种模型融合方法&#xff1a;SLERP、TIES、DARE和passthrough。通过配置示例和案例分析&#xff0c;作者详细阐…

Ansible playbook 剧本部署WEB NFS rsync sersync(及时监控)架构

ansible playbook剧本介绍&#xff1a; playbook 是ansible用于配置&#xff0c;部署和管理被节点的剧本 由一个或多个模块组成&#xff0c;完成统一的目的&#xff0c;实现自动化操作 剧本编写需遵循yaml语法 yaml的三要素&#xff1a; 缩进&#xff1a;两个字符&#xff0c;默…

【Vue3】toRefs和toRef在reactive中的一些应用

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

C++模板->模板的概念、函数模板基本语法、函数模板注意事项、普通函数与函数模板区别、普通函数与函数模板调用规则、模板的局限性

#include<iostream> using namespace std; //交换两个整型函数 void swapInt(int& a, int& b) { int temp a; a b; b temp; } //交换两个浮点型函数 void swapDouble(double& a, double& b) { double temp a; a b; b te…