进程线程间的通信:2024/2/22

作业1:代码实现线程互斥机制

代码:

#include <myhead.h>//临界资源
int num=10;//创建一个互斥锁
pthread_mutex_t mutex;//任务一
void *task1(void *arg)
{//获取锁资源pthread_mutex_lock(&mutex);num=123;sleep(3);printf("task1:num=%d\n",num);//释放锁资源pthread_mutex_unlock(&mutex);//退出线程pthread_exit(NULL);
}
//任务二
void *task2(void *arg)
{//获取锁资源pthread_mutex_lock(&mutex);num++;sleep(1);printf("task2:num=%d\n",num);//释放锁资源pthread_mutex_unlock(&mutex);//退出线程pthread_exit(NULL);
}
/*************************主程序************************/
int main(int argc, const char *argv[])
{//初始化互斥锁pthread_mutex_init(&mutex,NULL);//创建两个线程pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,task1,NULL) != 0){printf("create tid1 error\n");return -1;}if(pthread_create(&tid2,NULL,task2,NULL) != 0){printf("create tid1 error\n");return -1;}printf("tid1=%#lx tid2=%#lx\n",tid1,tid2);//回收资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//销毁互斥锁pthread_mutex_destroy(&mutex);return 0;
}

效果图:

作业2:代码实现无名信号量的线程同步机制

代码:

#include <myhead.h>//定义一个无名信号量
sem_t sem1;
sem_t sem2;
sem_t sem3;
//任务1
void *task1(void *arg)
{int num=4;while(num--){//申请资源sem_wait(&sem3);sleep(1);printf("A");fflush(stdout);           //刷新缓冲区//释放资源sem_post(&sem1);}//退出线程pthread_exit(NULL);}
//任务2
void *task2(void *arg)
{int num=4;while(num--){//申请资源sem_wait(&sem1);sleep(1);printf("B");fflush(stdout);           //刷新缓冲区//释放资源sem_post(&sem2);}//退出线程pthread_exit(NULL);}
//任务3
void *task3(void *arg)
{int num=4;while(num--){//申请资源sem_wait(&sem2);sleep(1);printf("C");fflush(stdout);           //刷新缓冲区//释放资源sem_post(&sem3);}//退出线程pthread_exit(NULL);}
/*********************主程序********************/
int main(int argc, const char *argv[])
{//初始化无名信号量sem_init(&sem1,0,0);sem_init(&sem2,0,0);sem_init(&sem3,0,1);//创建三个线程pthread_t tid1,tid2,tid3;if(pthread_create(&tid1,NULL,task1,NULL) != 0){printf("create tid1 error\n");return -1;}if(pthread_create(&tid2,NULL,task2,NULL) != 0){printf("create tid2 error\n");return -1;}if(pthread_create(&tid3,NULL,task3,NULL) != 0){printf("create tid3 error\n");return -1;}//回收资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);//销毁无名信号量sem_destroy(&sem1);sem_destroy(&sem2);sem_destroy(&sem3);puts("");return 0;
}

效果图:

作业3:代码实现条件变量的线程同步机制

代码:

#include <myhead.h>
//定义条件变量
pthread_cond_t cond;//定义互斥锁变量
pthread_mutex_t mutex;//生产者
void *task1(void *arg)
{int num=3;while(num--){sleep(1);printf("%#lx:摘了一个苹果\n",pthread_self());//唤醒一个进程pthread_cond_signal(&cond);}//退出线程pthread_exit(NULL);
}
//消费者
void *task2(void *arg)
{//获取锁资源pthread_mutex_lock(&mutex);//进入等待队列pthread_cond_wait(&cond,&mutex);printf("%#lx:吃了一个苹果\n",pthread_self());//释放锁资源pthread_mutex_unlock(&mutex);//退出进程pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{//初始化条件变量pthread_cond_init(&cond,NULL);//初始化互斥锁变量pthread_mutex_init(&mutex,NULL);//创建生产者与消费者线程pthread_t tid1,tid2,tid3,tid4;if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("create tid1 error\n");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("create tid2 error\n");return -1;}if(pthread_create(&tid3,NULL,task2,NULL)!=0){printf("create tid3 error\n");return -1;}if(pthread_create(&tid4,NULL,task2,NULL)!=0){printf("create tid4 error\n");return -1;}//回收资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);pthread_join(tid4,NULL);//销毁条件变量pthread_cond_destroy(&cond);//销毁互斥锁pthread_mutex_destroy(&mutex);return 0;
}

效果图:

作业4:代码实现无名管道的通信

代码:

#include <myhead.h>
int main(int argc, const char *argv[])
{//创建管道文件int pipefd[2]={0};if(pipe(pipefd)==-1){perror("pipe error");return -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){//清空数组内容bzero(rbuf,sizeof(rbuf));//从管道文件中读取数据read(pipefd[0],rbuf,sizeof(rbuf));printf("从父进程传来的数据:%s\n",rbuf);//判断写入的数据if(strcmp(rbuf,"quit")==0){break;}}//关闭管道读端close(pipefd[0]);//退出子进程exit(EXIT_SUCCESS);}else{perror("pid error");return -1;}return 0;
}

效果图:

作业5:代码实现有名管道的通信

代码:

create.c:

#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;
}

snd.c:

#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("请输入:");	fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]='\0';//将数据写入管道文件write(wfd,wbuf,strlen(wbuf));//结束输入的条件if(strcmp(wbuf,"quit")==0){break;}}//关闭文件close(wfd);return 0;
}

rec.c:

#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){//清空数组bzero(rbuf,sizeof(rbuf));//从管道读取数据read(rfd,rbuf,sizeof(rbuf));//输出结果printf("收到的数据为:%s\n",rbuf);//退出条件if(strcmp(rbuf,"quit")==0){break;}}//关闭文件close(rfd);return 0;
}

效果图:

作业6:使用有名管道完成两个进程的相互通信

(提示:可以使用多进程或多线程完成)

代码:

create.c:

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

snd.c:

#include <myhead.h>int main(int argc, const char *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("请输入:");	fgets(wbuf,sizeof(wbuf),stdin);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("./myfifo2",O_RDONLY))==-1){perror("open error");return -1;}char rbuf[128]="";while(1){//清空数组bzero(rbuf,sizeof(rbuf));//从管道读取数据read(rfd,rbuf,sizeof(rbuf));//输出结果printf("收到的数据为:%s\n",rbuf);//退出条件if(strcmp(rbuf,"quit")==0){break;}}//关闭文件close(rfd);}else{perror("pid error");return -1;}return 0;
}

rec.c:

#include <myhead.h>int main(int argc, const char *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("收到的数据为:%s\n",rbuf);//退出条件if(strcmp(rbuf,"quit")==0){break;}}//关闭文件close(rfd);}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("请输入:");	fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]='\0';//将数据写入管道文件write(wfd,wbuf,strlen(wbuf));//结束输入的条件if(strcmp(wbuf,"quit")==0){break;}}//关闭文件close(wfd);}else{perror("pid error");return -1;}return 0;
}

效果图:

作业7:思维导图

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

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

相关文章

【打工日常】使用docker部署StackEdit编辑器-Markdown之利器

一、StackEdit介绍 StackEdit一款强大的在线Markdown编辑器&#xff0c;不仅具备卓越的写作功能&#xff0c;还支持实时预览、多设备同步等特性。 很多时候基于安全和信息保密的关系&#xff0c;建议放在自己的服务器或者本地linux去运行&#xff0c;这样会比较省心。 二、本次…

电商数据采集+跨境电商|API电商数据采集接口洞悉数字新零售发展

随着全球经济一体化和电子商务的快速发展&#xff0c;网络购物的需求日益增加。不断涌现的电商企业使得行业的竞争情况愈演愈烈。在这种情况下&#xff0c;企业不仅要加大经营力度&#xff0c;还要在自己的基础设施和技术上持续投入&#xff0c;才能更好的适应市场和消费习惯。…

船运物流管理系统|基于springboot船运物流管理系统设计与实现(源码+数据库+文档)

船运物流管理系统目录 目录 基于springboot船运物流管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员登录 2、货运单管理 3、公告管理 4、公告类型管理 5、新闻管理 6、新闻类型管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 …

2024.2.22

P1162 #include<map> #include<vector> #include<iostream> #include<math.h> #include<algorithm> #include<string> using namespace std; const int N 1020; int n; int g[N][N];//标记数组 int a[N][N];//储存数组 int dx[] { -1…

《VitePress 简易速速上手小册》第9章 VitePress 的扩展与插件(2024 最新版)

文章目录 9.1 插件生态系统概述9.1.1 基础知识点解析9.1.2 重点案例&#xff1a;SEO 优化插件9.1.3 拓展案例 1&#xff1a;社交分享插件9.1.4 拓展案例 2&#xff1a;内容搜索插件 9.2 常用插件介绍与应用9.2.1 基础知识点解析9.2.2 重点案例&#xff1a;使用 SEO 插件9.2.3 拓…

day6 2/22

1> 将互斥机制的代码实现重新敲一遍 #include<myhead.h> int num520; pthread_mutex_t mutex;//创建互斥锁 void*task1(void*arg) {pthread_mutex_lock(&mutex);sleep(3);num;printf("%d\n",num);pthread_mutex_unlock(&mutex);pthread_exit(NULL)…

300分钟吃透分布式缓存-10讲:MC是怎么定位key的?

我们在进行 Mc 架构剖析时&#xff0c;除了学习 Mc 的系统架构、网络模型、状态机外&#xff0c;还对 Mc 的 slab 分配、Hashtable、LRU 有了简单的了解。本节课&#xff0c;将进一步深入学习这些知识点。 接下来&#xff0c;进入 Memcached 进阶的学习。会讲解 Mc 是如何进行…

《游戏引擎架构》 -- 学习4

资源及文件系统 文件系统 游戏引擎的文件系统API通常提供以下功能&#xff1a; 搜需路径&#xff1a;是含一串路径的字符串&#xff0c;各路径之间以特殊字符&#xff08;如冒号或分号&#xff09;分隔&#xff0c;找文件时就会从这些路径进行搜寻。例如在命令行下执行程序&a…

IBM集团战略规划方法论培训及案例应用

139页PPT | IBM集团战略规划方法论培训及案例应用 原创 顾问文库 咨询圈文库 2024-02-19 00:02 广东 关注下方名片学习更多企业架构和数字化内容 咨询圈文库 分享战略组织人力资源管理和数字化规划干货&#xff0c;共同成长。 24篇原创内容 公众号 战略规划是一种思考、分…

Retrofit2原理分析

Retrofit官网 GitHub上的Retrofit 使用Retrofit进行网络请求的主要步骤 创建一个接口 用于描述HTTP请求。接口里的方法使用注解来标记请求方式、API路径、请求参数等信息。使用Retrofit.Builder().build();配置和创建一个Retrofit实例&#xff1b;调用retrofit.create()方法获…

堆结构的实现和应用

堆结构的实现和应用 1. 堆结构的代码实现2. 向上调整算法和向下调整算法时间复杂度3. 堆排序3.1 方法一3.2 方法二3.3 建堆时间复杂度 4. TOP-K问题 1. 堆结构的代码实现 首先&#xff0c;我们先定义一个堆的结构&#xff0c;这里和顺序表的结构一样 typedef int HPDataType;…

Java项目:23 基于SSM实现的在线购物商城系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 这是一个基于ssm框架的购物系统 该项目中有五个子模块。shop-manager模块负责导入该项目所需要的所有依赖包。shop-web模块负责存放前端代码以及项目…