day6 2/22

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

#include<myhead.h>
int num=520;
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);
}void*task2(void*arg)
{pthread_mutex_lock(&mutex);sleep(1);num=1314;printf("%d\n",num);pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{pthread_t tid1=-1,tid2=1;pthread_mutex_init(&mutex,NULL);//初始化if(pthread_create(&tid1,NULL,task1,NULL)!=0){puts("tid1 create error");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){puts("tid2 create error");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_mutex_destroy(&mutex);return 0;
}

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

#include<myhead.h>
//创建无名信号量
sem_t sem1,sem2,sem3;
void*task1(void*arg)
{while(1){//申请资源sem_wait(&sem1);sleep(1);printf("A");fflush(stdout);sem_post(&sem2);}	pthread_exit(NULL);}
void*task2(void*arg)
{while(1){sem_wait(&sem2);sleep(1);printf("B");fflush(stdout);sem_post(&sem3);}pthread_exit(NULL);}
void*task3(void*arg)
{while(1){sem_wait(&sem3);sleep(1);printf("C");fflush(stdout);sem_post(&sem1);}	pthread_exit(NULL);}int main(int argc, const char *argv[])
{pthread_t tid1=-1,tid2=-1,tid3=-1;//初始化无名信号量sem_init(&sem1,0,1);sem_init(&sem2,0,0);sem_init(&sem3,0,0);if(pthread_create(&tid1,NULL,task1,NULL)!=0){puts("tid1 reate error");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){puts("tid2 reate error");return -1;}if(pthread_create(&tid3,NULL,task3,NULL)!=0){puts("tid3 reate error");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);sem_destroy(&sem1);sem_destroy(&sem2);sem_destroy(&sem3);return 0;
}

 

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

#include<myhead.h>
pthread_cond_t cond;
pthread_mutex_t mutex;//创建互斥锁
void*task1(void*arg)
{int num=5;while(num--){sleep(1);printf("%#lx的生产了一辆特斯拉\n",pthread_self());pthread_cond_signal(&cond);}pthread_exit(NULL);
}void*task2(void*arg)
{int num=5;while(num--){sleep(1);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_t tid1=-1,tid2=1,tid3=-1,tid4=-1,tid5=-1,tid6=-1;pthread_mutex_init(&mutex,NULL);//初始化pthread_cond_init(&cond,NULL);if(pthread_create(&tid1,NULL,task1,NULL)!=0){puts("tid1 create error");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){puts("tid2 create error");return -1;}	if(pthread_create(&tid3,NULL,task2,NULL)!=0){puts("tid3 create error");return -1;}if(pthread_create(&tid4,NULL,task2,NULL)!=0){puts("tid4 create error");return -1;}if(pthread_create(&tid5,NULL,task2,NULL)!=0){puts("tid5 create error");return -1;}if(pthread_create(&tid6,NULL,task2,NULL)!=0){puts("tid6 create error");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);pthread_join(tid4,NULL);pthread_join(tid5,NULL);pthread_join(tid6,NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}

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

#include<myhead.h>
void*task(void*arg)
{int pipefd[2]=*((int*)arg);close(pipefd[1]);char buf[128];while(1){bzero(buf,sizeof(buf));read(pipefd[0],buf,sizeof(buf));if(strcmp(buf,"quit")==0){break;}printf("收到:%s\n",buf);}}
int main(int argc, const char *argv[])
{int pipefd[2]={0};if(pipe(pipefd)==-1){perror("pipe error");return -1;}pthread_t tid=-1;if(pthread_create(&tid,NULL,task,pipefd)!=0){puts("create error");return -1;}close(pipefd[0]);char buf[128];while(1){puts("请输入数据");bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;write(pipefd[1],buf,strlen(buf));if(strcmp(buf,"quit")==0){break;}close(pipefd[1]);}pthread_join(&tid,NULL);return 0;
}

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

p.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;
}

 写端

#include<myhead.h>
int main(int argc, const char *argv[])
{int fd=-1;if((fd=open("./myfifo",O_WRONLY))==-1){perror("open error");return -1;}char buf[128];while(1){bzero(buf,sizeof(buf));printf("请输入>>>");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;write(fd,buf,sizeof(buf));if(strcmp(buf,"quit")==0){break;}}close(fd);return 0;
}

读端

#include<myhead.h>
int main(int argc, const char *argv[])
{int fd=-1;if((fd=open("./myfifo",O_RDONLY))==-1){perror("error open");return -1;}char buf[128];while(1){bzero(buf,sizeof(buf));read(fd,buf,sizeof(buf));if(strcmp(buf,"quit")==0){break;}printf("b:%s\n",buf);}return 0;
}

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

管道文件

#include<myhead.h>
int main(int argc, const char *argv[])
{if(mkfifo("./myfifo",0664)==-1){perror("mkfifo error");return -1;}if(mkfifo("./myfifo1",0664)==-1){perror("mkfifo error");return -1;}getchar();system( "rm myfifo");system( "rm myfifo1");return 0;
}

a:

#include<myhead.h>
int main(int argc, const char *argv[])
{pid_t pid=-1;pid=fork();if(pid==0){int fd=-1;if((fd=open("./myfifo",O_RDONLY))==-1){perror("error open");return -1;}char buf[128];while(1){bzero(buf,sizeof(buf));read(fd,buf,sizeof(buf));if(strcmp(buf,"quit")==0){break;}printf("b:%s\n",buf);}close(fd);exit(EXIT_SUCCESS);}else if(pid>0){int fa=-1;if((fa=open("./myfifo1",O_WRONLY))==-1){perror("open error");return -1;}char buf[128];while(1){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;write(fa,buf,sizeof(buf));if(strcmp(buf,"quit")==0){break;}}close(fa);}else{perror("fork error");return -1;}return 0;
}

b:

#include<myhead.h>
int main(int argc, const char *argv[])
{pid_t pid=-1;pid=fork();if(pid==0){int fd=-1;if((fd=open("./myfifo",O_WRONLY))==-1){perror("open error");return -1;}char buf[128];while(1){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]=0;write(fd,buf,sizeof(buf));if(strcmp(buf,"quit")==0){break;}}close(fd);exit(EXIT_SUCCESS);}else if(pid>0){int fa=-1;if((fa=open("./myfifo1",O_RDONLY))==-1){perror("open error");return -1;}char buf[128];while(1){bzero(buf,sizeof(buf));read(fa,buf,sizeof(buf));if(strcmp(buf,"quit")==0){break;}printf("a:%s\n",buf);}close(fa);wait(NULL);}else{perror("error fork");return -1;}return 0;
}

7>思维导图 

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

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

相关文章

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模块负责存放前端代码以及项目…

机器人内部传感器阅读笔记及心得-位置传感器-电位器式位置传感器

位置传感器 位置感觉是机器人最基本的感觉要求&#xff0c;可以通过多种传感器来实现。位置传感器包括位置和角度检测传感器。常用的机器人位置传感器有电位器式、光电式、电感式、电容式、霍尔元件式、磁栅式及机械式位置传感器等。机器人各关节和连杆的运动定位精度要求、重…

[力扣 Hot100]Day31 K 个一组翻转链表

题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点…

charles-mock数据

1、通过Charles抓包&#xff0c;找到需要mock的接口&#xff0c;把返回的结果保存到本地。 路径&#xff1a;接口选中-右键保存&#xff08;save Response&#xff09; 2、打开保存的文件&#xff0c;文件返回的结果/结构改成自己想要的模式&#xff0c;改好后保存文件 3、选中…

RM电控讲义【HAL库篇】

这段代码中do while的作用&#xff1a; 宏定义中的语句块&#xff1a;do { ... } while (0) 允许你在宏定义中创建一个语句块&#xff0c;从而可以包含多条语句。这在宏定义中特别有用&#xff0c;因为宏只是简单的文本替换&#xff0c;不像函数那样有作用域和返回类型。因此&…

电阻知识详解

基本介绍 电阻阻碍电流流动&#xff1a;只要有电流流过电阻&#xff0c;就会产生功率损耗 基本单位&#xff1a;欧姆&#xff0c;Ω 换算单位&#xff1a;微欧&#xff08;uΩ&#xff09;、毫欧&#xff08;mΩ&#xff09;、千欧&#xff08;kΩ&#xff09;、兆欧&#x…

YOLO v9 出世!

当今的深度学习方法专注于如何设计最合适的目标函数&#xff0c;以使模型的预测结果能够尽可能地接近真实值。同时&#xff0c;还需要设计一种适当的架构&#xff0c;以便为预测获取足够的信息。现有方法忽略了一个事实&#xff0c;即当输入数据经过逐层特征提取和空间转换时&a…