当前位置: 首页 > news >正文

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

结果:

相关文章:

day05-进程通信

1> 将互斥机制的代码实现重新敲一遍 代码&#xff1a; #include<myhead.h>int num520;//临界资源//1.创建互斥锁 pthread_mutex_t fastmutex;//定义任务函数 void *task1(void *arg){printf("1111111\n");//3.临界区上面获取锁资源&#xff08;上锁&#…...

如何将OpenAI Sora生成的普通AI视频转化为Vision Pro的空间视频,沉浸式体验

【基于AI的Vision Pro空间视频】工作流:这个工作流程用于将2D视频转换为适用于 Vision Pro的Spatial视频: 1、使用Deep3D将2D视频转换为3D SBS: 使用Deep3D工具将2D视频转换为3D SBS格式: 转换例子:Prediction– lucataco/deep3d – Replicatehttps://replicate.com/…...

爬虫基础(下)

requests模块可以用来获取网络数据&#xff1b; 那么对于爬虫来说&#xff0c;要获取下图网页中的内容&#xff0c;就需要网页的URL。 复制链接方法是&#xff0c;打开网页&#xff0c;点击链接框&#xff0c;右键选择复制。 requests.get()函数可用于模拟浏览器请求网页的过…...

【八股文面试】Java基础常见面试题总结(上)

Java基础常见面试题总结(上) Java有哪些特性 简单易学&#xff1b;面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;平台无关性&#xff08; Java 虚拟机实现平台无关性&#xff09;&#xff1b;支持多线程&#xff08; C 语言没有内置的多…...

c++:蓝桥杯的基础算法2(构造,模拟)+练习巩固

目录 构造 构造的基础概念&#xff1a; 模拟 练习1&#xff1a;扫雷 练习2&#xff1a;灌溉 练习3&#xff1a;回文日期 构造 构造的基础概念&#xff1a; 构造算法是一种用于解决特定问题的算法设计方法。在C语言中&#xff0c;构造算法通常涉及到创建一个函数或类来实…...

C++ 和 C#的区别

如是我闻&#xff1a; C#&#xff08;发音为 “C sharp”&#xff09;和C是两种流行的编程语言&#xff0c;它们各有特点和用途。下面是这两种语言的一些主要区别&#xff1a; 设计理念和用途: C: 是一种多范式编程语言&#xff0c;支持过程化编程、面向对象编程、泛型编程等。…...

2.14日学习打卡----初学Zookeeper(一)

2.14日学习打卡 目录: 2.14日学习打卡Zookeeper概念一. 集中式到分布式单机架构集群架构什么是分布式三者区别 二. CAP定理分区容错性一致性可用性一致性和可用性的矛盾一致性和可用性如何选择 三. 什么是Zookeeper分布式架构Zookeeper从何而来Zookeeper介绍 四. 应用场景数据发…...

SkyWalking之APM无侵入可观测原理分析

一、 简介&#xff08;为什么需要用到可观测能力&#xff09; 随着微服务的开发模式的兴起&#xff0c;早期的单体架构系统已拆分为很多的子系统&#xff0c;各个子系统封装为微服务&#xff0c;各服务间通过HTTP协议RESET API或者RPC协议进行调用。 在单体服务或者微服务较少的…...

Missing artifact org.yaml:snakeyaml:jar:1.29

关于导入本地maven项目pom.xml出现missing artifact org....报错处理 环境变量配置maven&#xff0c;eclipse中配置maven&#xff0c;重启eclipse。...

三opencv源码解压及环境变量配置

1.双击opencv-3.4.6-vc14-vc15.exe 2.选择解压的路径&#xff0c;点击【extract】 3.设计环境变量...

vue实时监控视频播放的进度,并在播放80%位置触发相应操作

video标签&#xff1a;播放时触发canplay事件 <video:src"filePath"controlsv-if"filePrefix mp4 || filePrefix avi"canplay"getVideoDur()"id"myVideo"class"preview"></video>canplay触发的方法&#xff…...

HTML+CSS滚动条样式如何单独给firefox设置 scrollbar-width: none;,而不影响其他浏览器

要在Firefox中单独设置滚动条样式,你可以使用​​@-moz-document​​规则。这个规则允许你为特定的浏览器或浏览器引擎应用样式。 下面是一个例子,演示如何在Firefox中隐藏滚动条: @-moz-document url-prefix() {/* 在这里添加只对Firefox生效的样式 */body {scrollbar-wi…...

《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)

文章目录 2.1 条件语句:决策的艺术2.1.1 基础知识讲解2.1.2 重点案例:用户角色权限判断实现用户角色权限判断扩展功能实现代码功能扩展:添加或删除用户2.1.3 拓展案例 1:成绩等级判断实现成绩等级判断功能实现代码扩展功能:详细反馈...

基于EasyCVR视频汇聚系统的公安网视频联网共享视频云平台建设思路分析(一)

随着社会的发展和科技的进步&#xff0c;视频监控系统在各个领域的应用越来越广泛&#xff0c;视频云平台建设已经成为了行业数字化转型的重要一环。公安网视频汇聚联网共享云的建设需要充分考虑技术、架构、安全、存储、计算等多方面因素&#xff0c;以确保平台的稳定性和可用…...

HQYJ 2024-2-21 作业

复习课上内容&#xff08;已完成&#xff09;结构体字节对齐&#xff0c;64位没做完的做完&#xff0c;32位重新都做一遍&#xff0c;课上指定2字节对齐的做一遍&#xff0c;自己验证&#xff08;已完成&#xff09;两种验证大小端对齐的代码写一遍复习指针内容&#xff08;已完…...

LeetCode每日一题【283. 移动零】

题目&#xff1a; 思路&#xff1a; 双指针&#xff0c;i和j。当i和j所指元素都不为0时&#xff0c;他们同时向后走&#xff0c;当j所指元素为0时&#xff0c;只走j&#xff0c;i固定。这样下来&#xff0c;i就指向最后一个非0元素的下一个位置&#xff0c;j就指向那些0元素之…...

CF1200E Compress Words

题目描述 Amugae has a sentence consisting of n words. He want to compress this sentence into one word. Amugae doesnt like repetitions, so when he merges two words into one word, he removes the longest prefix of the second word that coincides with a suffix…...

ip https证书推荐

公网IP地址是每个连接到互联网的设备所必需的标识。公网IP地址是用于在互联网上唯一标识一个设备的IP地址&#xff0c;它由一组由四个数字组成的字符串组成&#xff0c;每个数字在0到255之间。随着互联网的发展&#xff0c;只有公网IP地址的站点也开始重视传输信息安全&#xf…...

大气颗粒物与VOCs PMF源解析技术应用

目前&#xff0c;大气颗粒物和臭氧污染成为我国亟待解决的环境问题。颗粒物和臭氧污染不仅对气候和环境有重要影响&#xff0c;而且对人体健康有严重损害。而臭氧的前体物之一为挥发性有机物&#xff08;VOCs&#xff09;。为了高效、精准地治理区域大气颗粒物和臭氧污染&#…...

VSCODE中使用Vue3教程

VUE介绍 Vue.js is a popular JavaScript library for building web application user interfaces and Visual Studio Code has built-in support for the Vue.js building blocks of HTML, CSS, and JavaScript. For a richer Vue.js development environment, you can insta…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...