day05-进程通信

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

代码:

#include<myhead.h>int num=520;//临界资源//1.创建互斥锁
pthread_mutex_t fastmutex;//定义任务函数
void *task1(void *arg){printf("1111111\n");//3.临界区上面获取锁资源(上锁)pthread_mutex_lock(&fastmutex);num=1314;sleep(3);printf("task1:num = %d\n",num); //1314//4. 释放锁资源pthread_mutex_unlock(&fastmutex);
}void *task2(void *arg){printf("2222222\n");pthread_mutex_lock(&fastmutex);num++;      //521sleep(1);   //休眠时任务1执行到赋值语句printf("task2:num = %d\n",num);pthread_mutex_unlock(&fastmutex);
}int main(int argc, char const *argv[])
{//2.初始化互斥锁pthread_mutex_init(&fastmutex,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;}printf("tid1:%#lx, tid2:%#lx\n",tid1,tid2);//回收资源if(pthread_join(tid1,NULL)==0)printf("tid1回收成功\n");if(pthread_join(tid2,NULL)==0)printf("tid2回收成功\n");//5. 销毁锁资源pthread_mutex_destroy(&fastmutex);return 0;
}

结果:

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

代码:

#include<myhead.h>//创建无名信号了
sem_t sem;//定义生产者线程
void *task1(void *arg){printf("1111111\n");int num= 5;while(num--){//3.申请资源//    sem_wait(&sem);sleep(1);printf("我生产了一辆车\n");//4.释放资源sem_post(&sem);}pthread_exit(NULL);
}//定义消费者线程
void *task2(void *arg){printf("2222222\n");int num= 5;while(num--){//3.申请资源sem_wait(&sem);printf("我消费了一辆车\n");//4.释放资源//    sem_post(&sem);}pthread_exit(NULL);
}int main(int argc, char const *argv[])
{//初始化无名信号量sem_init(&sem,0,0);//第一个0:表示用于线程的同步//第二个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;}printf("tid1:%#lx, tid2:%#lx\n",tid1,tid2);//回收资源if(pthread_join(tid1,NULL)==0)printf("tid1回收成功\n");if(pthread_join(tid2,NULL)==0)printf("tid2回收成功\n");//释放无名信号量sem_destroy(&sem);return 0;
}

结果:

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

代码:

#include<myhead.h>//1. 定义条件变量
pthread_cond_t cond;//11. 创建互斥锁
pthread_mutex_t fastmutex;//定义生产者线程
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(&fastmutex);//4. 进入等待队列pthread_cond_wait(&cond,&fastmutex);printf("%#lx:消费了一辆车\n",pthread_self());//54. 释放锁资源pthread_mutex_unlock(&fastmutex);pthread_exit(NULL);
}int main(int argc, char const *argv[])
{//2. 初始化无名信号量pthread_cond_init(&cond,NULL);//22. 初始化互斥锁pthread_mutex_init(&fastmutex,NULL);//创建2个线程,分别是生产者和消费者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\ntid4:%#lx, tid5:%#lx, tid6:%#lx\n",tid1,tid2,tid3,tid4,tid5,tid6);//回收资源if(pthread_join(tid1,NULL)==0)printf("tid1回收成功\n");if(pthread_join(tid2,NULL)==0)printf("tid2回收成功\n");if(pthread_join(tid3,NULL)==0)printf("tid3回收成功\n");if(pthread_join(tid4,NULL)==0)printf("tid4回收成功\n");if(pthread_join(tid5,NULL)==0)printf("tid5回收成功\n");if(pthread_join(tid6,NULL)==0)printf("tid6回收成功\n");//5. 销毁条件变量pthread_cond_destroy(&cond);//55. 销毁锁资源pthread_mutex_destroy(&fastmutex);return 0;
}

结果:

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

代码:

#include<myhead.h>int main(int argc, char const *argv[])
{//创建管道文件,并返回该管道文件的文件描述符(最小位分配原则)int pipefd[2]={0};if(pipe(pipefd)==1)PRINT_ERR("");printf("pipedf[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){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);     //退出进程}elsePRINT_ERR("");    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, char const *argv[])
{//打开管道文件int wfd=1;//以只写的形式打开文件if((wfd=open("./myfifo",O_WRONLY))==-1)PRINT_ERR("");//定义容器char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));   //清空数组内容fgets(wbuf,sizeof(wbuf),stdin);     //从终端输入数据wbuf[strlen(wbuf)-1]=0;//将数据写入管道文件中write(wfd,wbuf,strlen(wbuf));//对写入的数据进行判断if(strcmp(wbuf,"quit")==0)break;}return 0;
}
#include<myhead.h>int main(int argc, char const *argv[])
{//打开管道文件int wfd=1;//以只读的形式打开文件if((wfd=open("./myfifo",O_RDONLY))==-1)PRINT_ERR("");//定义容器char rbuf[128]="";while(1){//清空rbuf内容bzero(rbuf,sizeof(rbuf));//将数据写入管道文件中read(wfd,rbuf,sizeof(rbuf));//输出rbuf的数据printf("父进程传来的数据为:%s\n",rbuf);//对读取的数据进行判断if(strcmp(rbuf,"quit")==0)break;}return 0;
}

结果:

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

代码:

管道文件创建

#include<myhead.h>int main(int argc, const char *argv[])
{//创建一个管道文件if(mkfifo("./myfifo1", 0664) == -1){perror("mkfifo1 error");return -1;}if(mkfifo("./myfifo2", 0664) == -1){perror("mkfifo2 error");return -1;}getchar();       //阻塞system("rm myfifo1");system("rm myfifo2");return 0;
}

线程:

#include<myhead.h>int main(int argc, char const *argv[])
{//创建一个子进程pid_t pid=fork();if(pid>0){//父进程//打开管道文件int wfd = -1;//以只写的形式打开文件if((wfd = open("./myfifo1", O_WRONLY)) == -1){perror("open error");return -1;}//定义容器char wbuf[128] = "";while(1){printf("这里是1号机,请输入>>>");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//将数据写入有名管道write(wfd, wbuf, strlen(wbuf));//判断结果if(strcmp(wbuf,"quit") == 0)break;}//关闭文件close(wfd);          
//        wait(NULL);  //阻塞回收子进程资源}else if(pid==0){//子进程//打开管道文件int rfd = -1;//以只写读的形式打开文件if((rfd = open("./myfifo2", O_RDONLY)) == -1){perror("open error");return -1;}//定义容器char rbuf[128] = "";while(1){//清空数组bzero(rbuf, sizeof(rbuf));//读取管道中的数据read(rfd, rbuf, sizeof(rbuf));//输出结果printf("\t\t\t\t\t1号机收到的数据为:%s\n", rbuf);//判断结果if(strcmp(rbuf,"quit") == 0)break;}//关闭文件close(rfd);exit(EXIT_SUCCESS);     //退出进程}elsePRINT_ERR("");    return 0;
}
#include<myhead.h>int main(int argc, char const *argv[])
{//创建一个子进程pid_t pid=fork();if(pid>0){//父进程//打开管道文件int rfd = -1;//以只写读的形式打开文件if((rfd = open("./myfifo1", O_RDONLY)) == -1){perror("open error");return -1;}//定义容器char rbuf[128] = "";while(1){//清空数组bzero(rbuf, sizeof(rbuf));//读取管道中的数据read(rfd, rbuf, sizeof(rbuf));//输出结果printf("\t\t\t\t\t2号机收到的数据为:%s\n", rbuf);//判断结果if(strcmp(rbuf,"quit") == 0)break;}//关闭文件close(rfd); //       wait(NULL);//   wait(NULL);  //阻塞回收子进程资源}else if(pid==0){//子进程//打开管道文件int wfd = -1;//以只写的形式打开文件if((wfd = open("./myfifo2", O_WRONLY)) == -1){perror("open error");return -1;}//定义容器char wbuf[128] = "";while(1){printf("这里是2号机,请输入>>>");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf)-1] = 0;//将数据写入管道write(wfd, wbuf, strlen(wbuf));//判断结果if(strcmp(wbuf,"quit") == 0)break;}//关闭文件close(wfd);      exit(EXIT_SUCCESS);     //退出进程}elsePRINT_ERR("");    return 0;
}

结果:

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

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

相关文章

【Linux从青铜到王者】 基础IO

本篇重点&#xff1a;文件描述符&#xff0c;重定向&#xff0c;缓冲区&#xff0c;磁盘结构&#xff0c;文件系统&#xff0c;inode理解文件的增删查改&#xff0c;查找一个文件为什么一定要有路径&#xff0c;动静态库&#xff0c;有的时候为什么找不到库&#xff0c;动态库的…

在苹果电脑MAC上安装Windows10(双系统安装的详细图文步骤教程)

在苹果电脑MAC上安装Windows10&#xff08;双系统安装的详细图文步骤教程&#xff09; 一、准备工作准备项1&#xff1a;U盘作为系统安装盘准备项2&#xff1a;您需要安装的系统镜像 二、启动转换助理步骤1&#xff1a;找到启动转换助理步骤2&#xff1a;启动转换助理步骤3&…

2024022202-查询优化

查询优化 概述 关系系统和关系模型是两个密切相关而有不同的概念。支持关系模型的数据库管理系统称为关系系统。但是关系模型中并非每一部分都是同等重要的&#xff0c;所以我们不苛求完全支持关系模型的系统才能称为关系系统。因此&#xff0c;我们给出一个关系系统的最小要求…

Google play应用上架,账号即将被封?你收到过这种骗子邮件吗?

相信大多数开发者&#xff0c;尤其对于马甲包或矩阵、批量上架的开发者来说&#xff0c;收到账号被封的邮件已经司空见惯了&#xff0c;但需要注意的是&#xff0c;并不是此类所有的邮件都是真的&#xff0c;有可能是骗子不怀好意伪装成谷歌官方发送的诈骗邮件。 例如这样的邮…

《UE5_C++多人TPS完整教程》学习笔记22 ——《P23 记录加入的玩家(Couting Incoming Players)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P23 记录加入的玩家&#xff08;Couting Incoming Players&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff…

SaaS智慧校园管理平台全套源码,支持二次开发,项目使用

什么是电子班牌系统&#xff1f; 电子班牌用来显示班级信息&#xff0c;班级活动信息以及学校的通知信息。信息内容为文字、图片、视频、FLASH等&#xff0c;为学生和老师提供新颖的师生交流及校园服务平台。融合了多媒体信息发布、家校互通、物联控制、教务管理、日常办公等一…

c++类和对象新手保姆级上手教学(下)

目录 前言&#xff1a; 初始化列表&#xff1a; explicit关键字&#xff1a; static成员&#xff1a; 友元函数&#xff1a; 友元类&#xff1a; 内部类&#xff1a; 匿名对象&#xff1a; 前言&#xff1a; 类和对象下篇中剩余的部分较为简单易理解&#xff0c;认真记住…

从大厂裸辞后成为自由职业者,一年后我怎么样了?

深耕技术领域7年&#xff0c;前前后后也做过不少副业&#xff0c;最近我一直在思考什么副业才是对自己有价值的&#xff0c;可持续的&#xff0c;甚至是可增长的。 22年我所在团队的一个项目解散了&#xff0c;领导问我想拿钱走还是转岗&#xff0c;想想自己也在这个公司干了5…

猫头虎分享已解决Bug || TypeError: unhashable type: ‘slice‘

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Java毕业设计-基于ssm的校园二手交易管理系统-第67期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于ssm的校园二手交易管理系统&#xff1a;前端jsp、jquery&#xff0c;后端 springmvc、spring、mybatis&#xff0c;集成商品管理、订单管理、销售管理、采购管理、购…

【ACW 导入数据库脚本】

版本: 1.2.2-JDK17-SNAPSHOT 项目地址&#xff1a;wu-smart-acw 演示地址&#xff1a;演示地址 admin/admin docker启动 docker run -d -it -p 18080:18080 -e MAIN_DB_HOSTcloud-mysql:3306 -e MAIN_DB_USERNAMEroot -e MAIN_PASSWORDmysql --name wu-smart-acw-server …

猫头虎分享已解决Bug || 容器编排问题:OrchestrationFailure, ContainerManagementError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …