多线程-互斥锁

 

从写互斥锁

#include <myhead.h>

char buf[128];   //临界资源

//1.创建互斥锁
pthread_mutex_t mutex;

//定义分支线程
void *task(void *arg)
{
	while(1)
	{
		//2.获取锁资源
		pthread_mutex_lock(&mutex);

		printf("分支线程中:buf = %s\n",buf);
		strcpy(buf,"l love china\n");

		//3.释放锁资源
		pthread_mutex_unlock(&mutex);
	}

}

int main(int argc, const char *argv[])
{
	//定义线程号变量
	
	pthread_t tid;
	//2.初始化互斥锁
	pthread_mutex_init(&mutex,NULL);

	//创建线程
	if(pthread_create(&tid,NULL,task,NULL)!=0)
	{
		printf("tid create error\n");
		return -1;
	}

	while(1)
	{
		printf("主线程buf=%s\n",buf);    //访问临界资源

		strcpy(buf,"hello world\n");
	}
		pthread_join(tid,NULL);         //阻赛回收线程资源
	return 0;
}

从写同步 

#include <myhead.h>

//1.创建一个无名信号量
	sem_t sem; 

//生产者线程
void *task1(void *arg)
{
	while(1)
	{
		sleep(2);
		printf("我生产了一辆特斯拉\n");
	}
	//释放资源
	sem_post(&sem);

}
//消费者资源
void *task2(void *arg)
{
	while(1)
	{
		sem_wait(&sem);  //申请资源,如果没有资源则阻塞
		printf("我消费了一辆特斯拉\n");
	}

}
int main(int argc, const char *argv[])
{
	//创建两个线程
	pthread_t tid1,tid2;
	
	//2.初始化无名信号量
	sem_init(&sem,0,0);

	//创建生产者线程
	if(pthread_create(&tid1,NULL,&task1,NULL)!=0)
	{
		printf("tid1 create error\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,&task2,NULL)!=0)
	{
		printf("tid2 create error\n");
		return -1;
	}

	//主线程资源回收
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);

	//销毁无名信号量
	sem_destory(&sem);
	return 0;
}

 

#include <myhead.h>

sem_t sem1,sem2,sem3;//三个线程分别的无名信号量

void *task1(void *arg)
{
	while(1)
	{
		sem_wait(&sem1);//当前任务的无名信号量
		putchar('A');
		fflush(stdout);//刷新缓冲区
		sleep(1);
		sem_post(&sem2);//无名信号量
	}
}
void *task2(void *arg)
{
	while(1)
	{
		sem_wait(&sem2);
		putchar('B');
		fflush(stdout);
		sleep(1);
		sem_post(&sem3);
	}
}
void *task3(void *arg)
{
	while(1)
	{
		sem_wait(&sem3);
		putchar('C');
		fflush(stdout);
		sleep(1);
		sem_post(&sem1);
	}
}
int main(int argc, const char *argv[])
{
	//无名信号量初始化
	sem_init(&sem1,0,1);
	sem_init(&sem2,0,0);
	sem_init(&sem3,0,0);
	//定义三个线程
	pthread_t tid1,tid2,tid3;
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		printf("error1\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("error2\n");
		return -1;
	}
	if(pthread_create(&tid3,NULL,task3,NULL)!=0)
	{
		printf("error3\n");
		return -1;
	}
	
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);
	return 0;
}

 

拷贝

#include <myhead.h>

//创建结构体
tepedef struct node
{
	int start;
	int leng;
	const char *src;
	const char *dest;
}sake;

int file_len(const char *src,const char *dest)
{
	//定义两个文件描述符
	int srcfd,destfd;

	//以只读形式打开源文件
	if((srcfd=open(src,O_RDONLY))==-1)
	{
		perror("srcfd error\n");
		return -1;
	}
	//以只写形式打开目标文件
	if((destfd=open(dest,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("destfd error\n");
		return -1;
	}
	int len =lseek(srcfd,0,SEEK_END);
	
	close(srcfd);
	close(destfd);
	return len;

}
void copy(const char *file1,const char *file2,int start,int len)
{
	//定义两个文件描述符
	int srcfd,destfd;
	int ret=0,count=0;
	//以只读形式打开源文件
	if(( srcfd = open(srcfd,O_RDONLY))==-1)
	{
		perror("srcfd error\n");
		return -1;
	}
	//以只写形式打开目标文件
	if((destfd=open(destfd,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("destfd error\n");
		return -1;
	}
	lseek(srcfd,start,SEEK_SET);
	lseek(destfd,start,SEEK_SET);
	char buf[10];
	while(1)
	{
		ret = read(src,buf,sizeof(buf));

		count+=ret;
		if(ret==0 || count>len)
		{
			write(destfd,buf,ret-(count-len));
			break;
		}
		write(destfd,buf,ret);
	}
	close(srcfd);
	close(destfd);
}
void *task1(void *arg)
{
	//从0开始拷贝到len/2
	copy(((sake*)arg->src,((sake*)arg)->dest,0,((sake*)arg)->len/2);
}
void *task2(void *arg)
{
	copy(((sake*)arg->src,((sake*)arg)->dest,(((sake*)arg)->len/2,((sake*)arg)->len-((sake*)arg)->len/2));
}
int main(int argc, const char *argv[])
{
	//判断外部参数
	if(argc !=3)
	{
		printf("enter error\n");
		printf("格式./a.out 源文件 目标文件\n");
		return -1;
	}
	int len = file_len(argv[1],argv[2]);

	//创建两个线程
	pthread_t tid1,tid2;
	
	if(pthread_creqte(&tid1,NULL,task1,)!=0)
	{
		printf("tid1 error\n");
		return -1;
	}
	if(pthread_creqte(&tid2,NULL,task2,)!=0)
	{
		printf("tid2 error\n");
		return -1;
	}
	//主线程回收资源
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	file = NULL;
	return 0;
}

 

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

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

相关文章

OpenShift 4 - 在 Jupyter Notebook 中使用 Elyra 执行 AI 处理流水线

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.14 RHODS 2.50 的环境中验证 说明&#xff1a;请先根据《OpenShift 4 - 管理和使用 OpenShift AI 运行环境》一文完成 MinIO 的安装。 注意&#xff1a;如无特殊说明&#xff0c;和 OpenS…

WWDG---窗口看门狗

一.简介 窗口看门狗跟独立看门狗一样&#xff0c;也是一个递减计数器不断的往下递减计数&#xff0c;必须在一个窗口的上限值&#xff08;用户定义&#xff09;和下限值&#xff08;0X40&#xff0c;固定不能变&#xff09;之间喂狗不会复位&#xff0c;在上限值之前和下限值之…

LabVIEW开发自动光学焊点检测系统

LabVIEW开发自动光学焊点检测系统 LabVIEW于开发了一个自动光学焊点检测系统&#xff0c;旨在提高电子元件焊接的质量和效率。通过利用LabVIEW的高级视觉开发模块&#xff0c;该系统能够准确地识别和分类电路板上的不同焊点类型&#xff0c;如桥接、虚焊、漏焊和多锡。这一进步…

<软考高项备考>《论文专题 - 53 进度管理(4) 》

6 过程5-制定进度计划 6.1 问题 4W1H过程做什么分析活动顺序、持续时间、资源需求和进度制约因素&#xff0c;创建进度模型&#xff0c;从而落实项目执行和监控的过程作用&#xff1a;为完成项目活动而制定具有计划日期的进度模型为什么做为项目制定衡量项目的进度标尺谁来做…

PCL 大地坐标转空间直角坐标(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 二、代码实现 头文件及读取保存函数见:PCL 空间直角坐标转大地坐标(直接求解法C…

如何制作活动报名收集系统,支持填表者单选、多选

发布者制作填表信息时&#xff0c;有些信息希望让用户直接选择&#xff0c;能够节省不必要的填写时间。 易查分【无需条件填表】以及【可修改列】功能可以制作支持9种填表类型的信息收集系统&#xff0c;本次就来介绍如何使用此功能。 &#x1f4cc;使用教程 &#x1f4d6;案例…

Win11怎么重置系统?(小白专享篇)

话不多说&#xff0c;直接上干货 重置Windows 11系统的步骤如下&#xff1a; 1.同时按下【Windowsi】键打开系统设置。 2.在当前页面下拉选择【系统】-【恢复】。 3.点击重置此电脑下的【初始化电脑】。 4.点击【删除所有内容】。 5.选择删除所有内容后&#xff0c;继续选…

结算时间和可组合性助力Sui上DeFi蓬勃发展

结算时间是基于Sui交易处理模型的度量标准&#xff0c;确保DeFi用户几乎立即看到交易结果。可组合性则是深深融入Sui的编程环境&#xff0c;扩展了其对对象和智能合约的影响。Sui深度的可组合性赋予DeFi构建者引入创新产品的能力&#xff0c;使其在其他区块链上的DeFi应用中独树…

24 主题切换

效果演示 实现了一个主题切换功能&#xff0c;当用户点击主题切换按钮时&#xff0c;背景颜色和文字颜色会随之改变&#xff0c;同时主体内容的背景颜色会从暗色变为浅色&#xff0c;文字颜色会从黑色变为白色。当用户再次点击主题切换按钮时&#xff0c;背景颜色和文字颜色会再…

SpringMVC源码解析——HTTP请求处理

在SpringMVC源码解析——DispatcherServlet的逻辑处理中&#xff0c;最后介绍到了org.springframework.web.servlet.DispatcherServlet的doDispatch方法中关于处理Web HTTP请求的核心代码是调用AbstractHandlerMethodAdapter类的handle方法&#xff0c;源码如下&#xff1a; /*…

【大数据】Spark学习笔记

初识Spark Spark和Hadoop HadoopSpark起源时间20052009起源地MapReduceUniversity of California Berkeley数据处理引擎BatchBatch编程模型MapReduceResilient distributed Datesets内存管理Disk BasedJVM Managed延迟高中吞吐量中高优化机制手动手动APILow levelhigh level流…

【MySQL】表的增删改查

表的增删改查 一、Create二、Retrieve1、SELECT 列2、WHERE 条件3、结果排序4、筛选分页结果 三、Update四、Delete1、删除数据2、截断表 六、插入查询结果 表的增删查改简称CRUD&#xff1a;Create&#xff08;新增&#xff09;&#xff0c;Retrieve&#xff08;查找&#xff…

任务调度实现

一、定时任务概述 在项目中开发定时任务应该一种比较常见的需求&#xff0c;在 Java 中开发定时任务主要有三种解决方案&#xff1a;一是使用JDK 自带的 Timer&#xff0c;二是使用 Spring Task&#xff0c;三是使用第三方组件 Quartz Timer 是 JDK 自带的定时任务工具,其简单易…

Mysql与Redis如何保证数据一致性问题

目录 一、Mysql与Redis同步数据是否存在延迟呢&#xff1f; 二、如何保证一致性&#xff1f; 2.1、第一种方式&#xff1a;手动编码 2.2、第二种方式&#xff1a;MQ异步更新 2.3、第三种方式&#xff1a;binlog同步数据 2.4、第四种方式&#xff1a;双写一致性 2.5、第五…

STM32---中断

中断框图 一.中断 中断&#xff1a;当有中断请求时&#xff0c;CPU会停止处理当前的任务&#xff0c;转而去处理中断任务。 中断输入线有19/20根&#xff08;互联型号20根&#xff09;。 分类&#xff1a;系统异常&#xff08;10个&#xff09;和外部中断&#xff08;60个&…

UE4 4.21-4.27使用编辑器蓝图EditorBlueprint方法

在UE4 4.21中&#xff0c;编辑器蓝图&#xff08;Editor Blueprint&#xff09;是一个强大的工具&#xff0c;允许开发者扩展和自定义Unreal编辑器的功能。通过编辑器蓝图&#xff0c;我们可以创建自定义的工具和功能&#xff0c;以优化开发流程。 本教程将指导您如何在UE4 4.…

【Origin绘图】准备工作:安装与卸载

Origin准备工作&#xff1a;安装与卸载 软件介绍&#xff1a;Origin安装Origin卸载参考 软件介绍&#xff1a; Origin是由OriginLab公司开发的一个科学绘图、数据分析软件,支持在Microsoft Windows下运行。Origin支持各种各样的2D/3D图形。Origin中的数据分析功能包括统计,信号…

探索文档图像大模型,提升智能文档处理性能

探索文档图像大模型&#xff0c;提升智能文档处理性能 0. 前言1. 垂直领域大模型论坛1.1 论坛介绍1.2 走近合合信息 2. 大模型时代下的文档图像智能处理2.1 大模型发展2.2 GPT-4V 在文档领域的表现2.3 GPT-4V 对智能文档处理的局限性 3. 大模型时代下的智能文档处理3.1 像素级 …

Java异常机制:从混乱到控制的错误管理艺术

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、异常的体系结构1、异常的体系结构2、异常的分类 二、异常的处理1、异常的抛出2、异常的捕获2.1、异常声明throws2.2、try-c…

加工制造EUV极紫外光刻机的钼/硅反射镜的方法与技术

EUV光刻机使用的反射镜材质是具有极高精度的钼/硅反射镜。这是因为几乎所有材料对13.5nm的EUV都强烈吸收&#xff0c;故EUV光刻机不能采用DUV那样的透镜&#xff0c;只能采用反射式光学系统。又因为EUV波长与晶格参数接近&#xff0c;很容易发生衍射&#xff0c;反射率也很低&a…
最新文章