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>思维导图 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024/2/22

P8680 [蓝桥杯 2019 省 B] 特别数的和 题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣&#xff08;不包括前导 00&#xff09;&#xff0c;在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40&#xff0c;共28 个&#xff0c;他们的和是574。 请问&#xff0c;在…

【Git】:标签功能

标签功能 一.标签操作二.推送远程标签 标签 tag &#xff0c;可以简单的理解为是对某次commit的⼀个标识&#xff0c;相当于起了⼀个别名。例如&#xff0c;在项⽬发布某个版本的时候&#xff0c;针对最后⼀次commit起⼀个v1.0这样的标签来标识⾥程碑的意义。这有什么⽤呢&…

CRF算法(Conditional Random Fields)揭秘

CRF基本介绍 在机器学习中&#xff0c;建模线性序列结构的方法&#xff0c;除了HMM算法&#xff0c;另一个重要的模型就是CRF。HMM为了降低模型复杂性&#xff0c;对观测变量做了独立假设(即隐状态之间有相关性&#xff0c;而观测变量之间没有相关性)&#xff0c;这在某种程度…

五种多目标优化算法(MSSA、MOJS、NSWOA、MOPSO、MOAHA)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MSSA 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0c…

C2-1.4(L1,L2)正则化

C2-1.4&#xff08;L1,L2&#xff09;正则化 参考书籍 1 正则化的概念 正则化(Regularization) 是机器学习中对原始损失函数引入额外信息&#xff0c;以便防止过拟合和提高模型泛化性能的一类方法的统称。也就是目标函数变成了原始损失函数额外项&#xff0c;常用的额外项一般…

Python实现简易小钢琴

Python实现简易小钢琴 使用Python和内带的Tkinter库、winsound 模块实现的简单小钢琴。 Tkinter库和winsound模块不需要额外安装就可以使用&#xff0c;因为它们是Python的标准库之一&#xff0c;已经随着Python的安装包一起提供。标准库是Python官方提供的一组核心模块和工具…

MFC 多文档程序的基本编程

下载了一个openGL mfc的多文档程序,以此来学习mfc多文档模式的编程; 它每次新建一个文档,会在窗口绘制一个三角形、一个矩形;如果没有了图形刷新一下; 先看一下为什么每次打开新文档会绘制图形; 生成工程之后主要有5个类,比单文档程序多了一个子框架类; 可以打开多个…

C++:STL简介

1. 什么是STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 。 2. STL的版本 3. STL的六大组件 4.STL的缺陷 1. STL库的更新太慢了。这…

计算机设计大赛 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度&#xff0c;召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】时间复杂度 | 空间复杂度

目录 1 -> 算法效率 1.1 -> 如何衡量一个算法的好坏&#xff1f; 1.2 -> 算法的复杂度 2 -> 时间复杂度 2.1 -> 时间复杂度的概念 2.2 -> 大O的渐进表示法 2.3 -> 常见时间复杂度计算 3 -> 空间复杂度 4 -> 常见复杂度对比 1 -> 算法效…

第2部分 基础篇 第2章 隐私计算技术简介(1)

2.6.1. 隐私计算技术解决什么问题&#xff1f; 本聪老师&#xff1a;关于隐私计算&#xff0c;我想先问大家一个问题&#xff1a;隐私计算技术能够解决什么问题&#xff1f; 小明&#xff1a;是不是应该是保护用户的隐私。 本聪老师&#xff1a;可以这么说&#xff0c;但是怎…

一 些有代表性的相位解包裹算法

Itoh首先给出了传统解包裹算法的数学描述!。传统的相位解包裹操作是通过对空间相邻点相位值的比较来完成的。根据抽样定理&#xff0c;如果相邻采样点的相位差不超过z&#xff0c;则对应的相位解包裹处理是非常简单的&#xff0c;理论上以某点为起始点沿某一路径对包裹相位的差…

如何使用Docker部署MongoDB并结合内网穿透实现远程访问本地数据库

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 …

机器学习第二十八周周报 PINNs2

文章目录 week28 PINNs2摘要Abstract一、Lipschitz条件二、文献阅读1. 题目数据驱动的偏微分方程2. 连续时间模型3. 离散时间模型4.结论 三、CLSTM1. 任务要求2. 实验结果3. 实验代码3.1模型构建3.2训练过程代码 小结参考文献 week28 PINNs2 摘要 本文主要讨论PINN。本文简要…

如何利用内网穿透工具在企业微信开发者中心实现本地接口服务回调

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段&#xff0c;应用服务通常是部署在开发环境&#xff0c;在有数据回调的开发场…

猫头虎分享已解决Bug || Web服务故障:WebServiceUnavailable, HTTPServerError

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

跑步也要飙起来:南卡、韶音、墨觉骨传导耳机大比拼

作为一个热衷于运动同时又不能离开音乐的人&#xff0c;我总是在寻找一款既能让我自由奔跑&#xff0c;又能享受到美妙音乐的耳机。记得买耳机前&#xff0c;朋友都说骨传导耳机就像个小喇叭&#xff0c;漏音厉害&#xff0c;我却不这么认为。对我来说&#xff0c;骨传导耳机不…

Pormise---如何解决javascript中回调的信任问题?【详解】

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 回调中的信任问题回调给我们带来的烦恼&#xff1f;调用过早调用过晚调用的次数太少或太多调用回调时未能…

【Django】Django自定义后台表单——对一个关联外键对象同时添加多个内容

以官方文档为例&#xff1a; 一个投票问题包含多个选项&#xff0c;基本的表单设计只能一个选项一个选项添加&#xff0c;效率较低&#xff0c;如何在表单设计中一次性添加多个关联选项&#xff1f; 示例代码&#xff1a; from django.contrib import adminfrom .models impo…

game项目(梦开始的地方)

梦开始的地方 由于easyx只支持vis&#xff0c;所以这个项目的书写以后都是在vis上进行&#xff0c;希望自己能够把这个项目好好完成&#xff0c;相信自己&#xff0c;加油&#xff01; 我们需要一个头文件来包括作图工具 (这个头文件在easyx上面下载) #include<graphics.…