IO进程线程

IO练习

互斥机制练习
#include <myhead.h>
int num = 520;
pthread_mutex_t mutex;void *task1(void *arg)
{printf("11111111\n");pthread_mutex_lock(&mutex);num = 1314;sleep(3);printf("task1:num=%d\n",num);pthread_mutex_unlock(&mutex);}void *task2(void *arg)
{printf("22222222\n");pthread_mutex_lock(&mutex);num++;sleep(1);printf("task2:num=%d\n",num);pthread_mutex_unlock(&mutex);
}
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("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);pthread_mutex_destroy(&mutex);return 0;
}
效果图

无名信号量练习
#include<myhead.h>//1、创建无名信号量
sem_t sem;//定义生产者线程
void *task1(void *arg)
{int num = 5;while(num --){sleep(1);printf("我生产了一辆特斯拉\n");//4、释放资源sem_post(&sem);}pthread_exit(NULL);        //退出线程
}//定义消费者线程
void *task2(void *arg)
{int num = 5;while(num--){//3、申请资源sem_wait(&sem);printf("我消费了一辆特斯拉\n");}pthread_exit(NULL);
}/************************主程序********************/
int main(int argc, const char *argv[])
{//2、初始化无名信号量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);//回收线程资源pthread_join(tid1, NULL);pthread_join(tid2, NULL);//释放无名信号量sem_destroy(&sem);return 0;
}
效果图

条件变量的练习
#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)
{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, 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);pthread_cond_destroy(&cond);pthread_mutex_destroy(&mutex);return 0;
}
效果图

无名管道的练习
#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){bzero(wbuf,sizeof(wbuf));fgets(wbuf,sizeof(wbuf),stdin);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("fork error");return -1;}return 0;
}
效果图

有名管道的练习
创建
#include <myhead.h>
int main(int argc, const char *argv[])
{if((mkfifo("./MYFIFO",0664))==-1){perror("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("error");return -1;}char str[128]="";while(1){fgets(str,sizeof(str),stdin);str[strlen(str)-1]=0;write(wfd,str,strlen(str));if(strcmp(str,"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("error");return -1;}char str[128]="";while(1){bzero(str,sizeof(str));read(rfd,str,sizeof(str));printf("接受的数据:%s\n",str);if(strcmp(str,"quit")==0){break;}}close(rfd);return 0;
}
效果图

使用有名管道完成两个进程的相互通信(使用多线程完成)
创建
#include <myhead.h>
int main(int argc, const char *argv[])
{if(mkfifo("./myfifo1",0664)==-1){perror("mkfifo myfifo1 error");return -1;}if(mkfifo("./myfifo2",0664)==-1){perror("mkfifo myfifo2 error");return -1;}printf("创建管道文件成功\n");printf("按回车删除管道文件>>>>");getchar();system("rm myfifo1");system("rm myfifo2");return 0;
}
 user1
#include <myhead.h>//线程1:实现写功能
void *task1(void *arg)
{int wfd=-1;if((wfd=open("./myfifo1",O_WRONLY))==-1){perror("error");}char str[128]="";while(1){fgets(str,sizeof(str),stdin);str[strlen(str)-1]=0;write(wfd,str,strlen(str));if(strcmp(str,"quit")==0){break;}}close(wfd);pthread_exit(NULL);}//线程2:实现读功能
void *task2(void *arg)
{int rfd=-1;if((rfd=open("./myfifo2",O_RDONLY))==-1){perror("error");}char str[128]="";while(1){bzero(str,sizeof(str));read(rfd,str,sizeof(str));printf("慕容二狗:%s\n",str); if(strcmp(str,"quit")==0){break;}}close(rfd);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{//创建分线程pthread_t pid1=-1;pthread_t pid2=-1;if(pthread_create(&pid1,NULL,task1,0)!=0){printf("ERROR");return -1;}if(pthread_create(&pid2,NULL,task2,0)!=0){printf("ERROR");return -1;}pthread_join(pid1,NULL);pthread_join(pid2,NULL);return 0;
}
user2
#include <myhead.h>//线程1:实现写功能
void *task1(void *arg)
{int wfd=-1;if((wfd=open("./myfifo2",O_WRONLY))==-1){perror("error");}char str[128]="";while(1){fgets(str,sizeof(str),stdin);str[strlen(str)-1]=0;write(wfd,str,strlen(str));if(strcmp(str,"quit")==0){break;}}close(wfd);pthread_exit(NULL);
}//线程2:实现读功能
void *task2(void *arg)
{int rfd=-1;if((rfd=open("./myfifo1",O_RDONLY))==-1){perror("error");}char str[128]="";while(1){bzero(str,sizeof(str));read(rfd,str,sizeof(str));printf("西门苟剩:%s\n",str); if(strcmp(str,"quit")==0){break;}}close(rfd);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{//创建分线程pthread_t pid1=-1;pthread_t pid2=-1;//设置无名if(pthread_create(&pid1,NULL,task1,0)!=0){printf("ERROR");return -1;}if(pthread_create(&pid2,NULL,task2,0)!=0){printf("ERROR");return -1;}pthread_join(pid1,NULL);pthread_join(pid2,NULL);return 0;
}
效果图

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

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

相关文章

Vue样式绑定

1. 绑定 HTML class ①通过class名称的bool值判断样式是否被启用 <template><!--通过样式名称是否显示控制样式--><div :class"{ haveBorder: p.isBorder, haveBackground-color: p.isBackgroundcolor }">此处是样式展示区域</div><br /…

基于springboot+vue的中小企业设备管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

mac真的安装不了vmware吗 mac如何安装crossover crossover序列号从哪里买 购买正版渠道

有些用户可能想在mac上运行一些只能在windows上运行的软件&#xff0c;比如游戏、专业软件等。这时候&#xff0c;就需要用到虚拟机技术&#xff0c;也就是在mac上安装一个可以模拟其他操作系统的软件&#xff0c;比如vmware或者crossover。那么&#xff0c;mac真的安装不了vmw…

众安保险基于Apache SeaTunnel的生产应用实践

*> 文&#xff5c;曾力 众安保险大数据开发高级专家 编辑整理&#xff5c; 曾辉* 前言 众安保险从2023年4月就开始了数据集成服务的预研工作&#xff0c;意在通过该服务解决当前数据同步场景下的两大痛点&#xff0c;服务化能力薄弱和无分布式同步能力。我们对多种开源数据…

独家深度 | 一文看懂 ClickHouse vs Elasticsearch:谁更胜一筹?

简介&#xff1a; 本文的主旨在于通过彻底剖析ClickHouse和Elasticsearch的内核架构&#xff0c;从原理上讲明白两者的优劣之处&#xff0c;同时会附上一份覆盖多场景的测试报告给读者作为参考。 作者&#xff1a;阿里云数据库OLAP产品部 仁劼 原文地址:https://developer.ali…

ubuntu20.04安装实时内核补丁PREEMPT_RT

参考&#xff1a; Ubuntu 18.04安装 RT-PREEMPT 实时内核及补丁【过程记录】_ubuntu18.04 preempt rt linux 5.6.19-CSDN博客 https://github.com/UniversalRobots/Universal_Robots_ROS_Driver/blob/master/ur_robot_driver/doc/real_time.md当前内核&#xff1a;5.15.0-94-ge…

备战蓝桥杯---动态规划(应用2(一些十分巧妙的优化dp的手段))

好久不见&#xff0c;甚是想念&#xff0c;最近一直在看过河这道题&#xff08;感觉最近脑子有点宕机QAQ&#xff09;&#xff0c;现在算是有点懂了&#xff0c;打算记录下这道又爱又恨的题。&#xff08;如有错误欢迎大佬帮忙指出&#xff09; 话不多说&#xff0c;直接看题&…

免费搭建个人网盘

免费搭建一个属于个人的网盘。 服务端 详情请参考原网站的服务端下载和安装虚拟磁盘Fuse4Ui可以支持把网盘内容挂载成系统的分区&#xff1b; 挂载工具效果图&#xff1a;应用端应用端的下载 效果图

适配器模式:转换接口,无缝对接不同系统

文章目录 **一、技术背景与应用场景****为什么使用适配器模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、适配器模式定义与结构****三、使用步骤举例****四、优缺点分析****总结** 一、技术背景与应用场景 适配器模式在软件设计中扮演着桥梁角色&#xff…

猫头虎分享已解决Bug || TypeError: ‘NoneType‘ object is not callable

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

jvm垃圾收集器-三色标记算法

1.对象已死吗? 在堆里面存放着Java世界中几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前&#xff0c;第一件事情就是要确定这些对象之中哪些还“存活”着&#xff0c;哪些已经“死去”&#xff08;即不可能再被任何途径使用的对象). 引计数法 引用计数算法是一…

挑战30天学完Python:Day16 日期时间

&#x1f4d8; Day 16 &#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点…