2024.2.22

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

#include<myhead.h>
int num=520;    //临界资源
//1、创建一个互斥锁变量
pthread_mutex_t mutex;
void *task1(void *arg)
{printf("11111111\n");//3、获取锁资源pthread_mutex_lock(&mutex);num=1314;sleep(3);printf("task1:num=%d\n",num);//4、释放锁资源pthread_mutex_unlock(&mutex);
}
void *task2(void *arg)
{printf("2222222222\n");//获取锁资源pthread_mutex_lock(&mutex);num++;      //521sleep(1);  //休眠时任务1执行到赋值语句printf("task2:num=%d\n",num);//释放锁资源pthread_mutex_unlock(&mutex);
}
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 ){perror("tid1 create error\n");return 0;}if( pthread_create(&tid2,NULL,task2,NULL) !=0 ){perror("tid1 create error\n");return 0;}printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);//回收线程资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//销毁锁资源pthread_mutex_destroy(&mutex);return 0;return 0;
}

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

#include<myhead.h>
//1、创建无名信号量
sem_t sem;
void *task1(void *arg)
{int num=5;while(num--){sleep(1);printf("我生产了一辆特斯拉\n");sem_post(&sem);}pthread_exit(NULL);}
void *task2(void *arg)
{int num=5;while(num--){sem_wait(&sem);printf("我消费了一辆特斯拉\n");}pthread_exit(NULL);
}
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;}printf("tid1:%#lx,tid2:%#lx\n",tid1,tid2);//回收线程资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//释放无名变量sem_destroy(&sem);return 0;
}

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

#include<myhead.h>
//1、定义条件变量
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)
{//上锁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_t tid1,tid2,tid3,tid4,tid5,tid6;if(pthread_create(&tid1,NULL,task1,NULL)!=0){perror("tid1 create error\n");return 0;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){perror("tid2 create error\n");return 0;}if(pthread_create(&tid3,NULL,task2,NULL)!=0){perror("tid3 create error\n");return 0;}if(pthread_create(&tid4,NULL,task2,NULL)!=0){perror("tid4 create error\n");return 0;}if(pthread_create(&tid5,NULL,task2,NULL)!=0){perror("tid5 create error\n");return 0;}if(pthread_create(&tid6,NULL,task2,NULL)!=0){perror("tid6 create error\n");return 0;}printf("tid1:%#lx,tid2:%#lx,tid4:%#lx,tid5:%#lx,tid:%#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);//销毁条件变量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\n");return -1;}printf("pipefd[0]=%d,pipefd[1]=%d\n",pipefd[0],pipefd[1]);//创建一个子进程pid_t pid=fork();if(pid>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);}else{perror("fork 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();//阻塞return 0;
}
send.c
ubuntu@ubuntu:~/IO23121/day6$ cat 5work2.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;
}
recevie.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;
}

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

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

相关文章

LabVIEW多通道压力传感器实时动态检测

LabVIEW多通道压力传感器实时动态检测 介绍了一种基于LabVIEW的多通道压力传感器实时动态检测系统&#xff0c;解决压阻式压力传感器温度补偿过程的复杂度&#xff0c;提高测量的准确性。通过自动轮询检测方法&#xff0c;结合硬件检测模型和多通道检测系统设计&#xff0c;本…

基于ESP32+Platformio的物联网RTOS_SDK-CC_Device

本项目基于ESP32以及Platformio平台开发&#xff0c;请自行查阅如何配置这个环境 开源gitee地址&#xff1a;cc_smart_device 如果愿意贡献项目or提出疑问和修改的&#xff0c;请在gitee上提issue 项目里的mqtt服务器是公共的 请大家最好换成私有的 否则容易收到其他用户的错误…

unity学习(34)——角色选取界面(跨场景坑多)

先把SelectMenu中的camera的audio listener去掉。 现在还是平面&#xff0c;直接在camera下面添加两个panel即可&#xff0c;应该是用不到canvas了&#xff0c;都是2D的UI。 加完以后问题来了&#xff0c;角色选择界面的按钮跑到主界面上边了&#xff0c;而且现在账号密码都输…

LabVIEW多场景微振动测试平台与教学应用

LabVIEW多场景微振动测试平台与教学应用 在多种工程实践中&#xff0c;微振动的测试与分析对于评估结构的稳定性及其对环境的影响至关重要。针对这一需求&#xff0c;开发了一套基于NI-cDAQ和LabVIEW的多场景微振动测试平台&#xff0c;提高微振动测试的精确度与灵活性&#x…

通过MetricsAPI监控pod资源使用情况(k8s资源监控,java)

1. 目的&#xff1a;简单监控pod 我想使用java监控k8s pod的资源的简单使用情况&#xff0c;但是k8s内部并没有采集资源的实现。 但是k8s提供了一套k8s的对接标准&#xff0c;只要适配这套标准&#xff0c;就可以通过kubelet采集资源数据&#xff0c;并且通过k8s api服务器输出…

golang实现延迟队列(delay queue)

golang实现延迟队列 1 延迟队列&#xff1a;邮件提醒、订单自动取消 延迟队列&#xff1a;处理需要在未来某个特定时间执行的任务。这些任务被添加到队列中&#xff0c;并且指定了一个执行时间&#xff0c;只有达到指定的时间点时才能从队列中取出并执行。 应用场景&#xff1…

nginx的功能以及运用(编译、平滑升级、提高服务器设置、location alias 等)

nginx与apache的对比 nginx优点 nginx使用场景 编译安装nginx过程 1.先清空opt文件夹 2.关闭防火墙&#xff0c;关闭防护 3 安装依赖包&#xff0c;可以通过本地yum去安装 首先就是挂载&#xff0c;随后切换到配置文件中修改 4本地配置文件配置内容 5 随后安装环境包 yum -y …

什么是nginx 、安装nginx

一、 什么是nginx 1.1 nginx的概念 一款高新能、轻量级Web服务软件系统资源消耗低对HTTP并发连接的处理能力高单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 1.2 nginx模块与作用 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错…

Js如何判断两个数组是否相等?

本文目录 1、通过数组自带方法比较2、通过循环判断3、toString()4、join()5、JSON.stringify() 日常开发&#xff0c;时不时会遇到需要判定2个数组是否相等的情况&#xff0c;需要实现考虑的场景有&#xff1a; 先判断长度&#xff0c;长度不等必然不等元素位置其他情况考虑 1…

Go语言中的TLS加密:深入crypto/tls库的实战指南

Go语言中的TLS加密&#xff1a;深入crypto/tls库的实战指南 引言crypto/tls库的核心组件TLS配置&#xff1a;tls.Config证书加载与管理TLS握手过程及其实现 构建安全的服务端创建TLS加密的HTTP服务器配置TLS属性常见的安全设置和最佳实践 开发TLS客户端应用编写使用TLS的客户端…

⭐北邮复试刷题LCR 052. 递增顺序搜索树__DFS (力扣119经典题变种挑战)

LCR 052. 递增顺序搜索树 给你一棵二叉搜索树&#xff0c;请 按中序遍历 将其重新排列为一棵递增顺序搜索树&#xff0c;使树中最左边的节点成为树的根节点&#xff0c;并且每个节点没有左子节点&#xff0c;只有一个右子节点。 示例 1&#xff1a; 输入&#xff1a;root [5,…

⭐北邮复试刷题LCR 037. 行星碰撞__栈 (力扣119经典题变种挑战)

LCR 037. 行星碰撞 给定一个整数数组 asteroids&#xff0c;表示在同一行的小行星。 对于数组中的每一个元素&#xff0c;其绝对值表示小行星的大小&#xff0c;正负表示小行星的移动方向&#xff08;正表示向右移动&#xff0c;负表示向左移动&#xff09;。每一颗小行星以相…

stm32和嵌入式linux可以同步学习吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「stm3的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;如果需要使用STM32&#xff0c;建…

TCP 三次握手和四次挥手

为了准确无误地把数据送达目标处&#xff0c;TCP协议采用了三次握手策略。 1 TCP 三次握手漫画图解 如下图所示&#xff0c;下面的两个机器人通过3次握手确定了对方能正确接收和发送消息(图片来源网络)。 简单示意图&#xff1a; 客户端–发送带有 SYN 标志的数据包–一次握手…

如何使用Docker部署开源Leanote蚂蚁笔记并发布个人博客至公网

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. 安装Docker2. Docker本地部署Leanote蚂蚁笔记3. 安装…

2000-2022年各省城乡收入差距泰尔指数数据(原始数据+计算过程+结果)

2000-2022年各省城乡收入差距泰尔指数数据&#xff08;原始数据计算过程结果&#xff09; 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;地区、居民可支配收入&#xff08;元&#xff09;、农村家庭可支配&#xff08;元&#xff09;、城市家庭可支配&#xff08;元&a…

【Algorithms 4】算法(第4版)学习笔记 10 - 3.3 平衡查找树(上篇)

文章目录 前言参考目录学习笔记0&#xff1a;符号表 ST 的回顾1&#xff1a;2-3 查找树1.1&#xff1a;定义1.2&#xff1a;2-3 树 demo 演示1.2.1&#xff1a;搜索&#xff1a;成功命中1.2.2&#xff1a;搜索&#xff1a;未命中1.2.3&#xff1a;插入&#xff1a;2-节点1.2.4&…

IP地理位置查询定位:技术原理与实际应用

在互联网时代&#xff0c;IP地址是连接世界的桥梁&#xff0c;而了解IP地址的地理位置对于网络管理、个性化服务以及安全监控都至关重要。IP数据云将深入探讨IP地理位置查询定位的技术原理、实际应用场景以及相关的隐私保护问题&#xff0c;旨在为读者提供全面了解和应用该技术…

猫头虎分享已解决Bug || SyntaxError: Unexpected token < in JSON at position 0

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

ubuntu制作windows的u盘启动盘

概要&#xff1a; 本篇演示在ubuntu22.04中制作windows10的u盘启动盘 一、下载woeusb 1、下载woeusb 在浏览器中输入https://github.com/woeusb/woeusb/releases访问woeusb 点击红色矩形圈出来的部分&#xff0c;下载woeusb 2、安装wimtools wimtools是woeusb的一个必须的…