首页 > 其他分享 >多线程文件拷贝

多线程文件拷贝

时间:2024-02-29 22:02:45浏览次数:26  
标签:count 文件 include addr int mutex pthread 拷贝 多线程

多线程文件拷贝

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
pthread_mutex_t mutex;
char *src_addr=NULL;
char *new_addr=NULL;
int count;
void *pth_work(void *arg)
{
	int i=*(int *)arg;
	pthread_mutex_lock(&mutex);//上锁
	printf("%ld子线程开始拷贝.....\n",pthread_self());
	memcpy(new_addr+i*count,src_addr+i*count,count);
	pthread_mutex_unlock(&mutex);//解锁
}
int main(int argc, char **argv)
{
	int fp=open(argv[1],0);
	if(fp<0)
	{
		printf("文件打开失败\n");
		return 0;
	}
	int new_fp=open(argv[2],O_RDWR|O_CREAT,0666);
	if(new_fp<0)
	{
		printf("新文件打开失败\n");
		return 0;
	}
	//获取文件大小
	struct stat statbuf;
	fstat(fp,&statbuf);
	//设置新文件大小
	ftruncate(new_fp,statbuf.st_size);
	//内存映射
	src_addr=mmap(NULL,statbuf.st_size,PROT_READ,MAP_PRIVATE,fp,0);
	new_addr=mmap(NULL,statbuf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,new_fp,0);
	close(fp);
	close(new_fp);
	//内存拷贝
	count=statbuf.st_size/5;
	int remain=statbuf.st_size%5;
	//创建普通锁
	pthread_mutex_init(&mutex,NULL);
	pthread_t pthid;
	int i=0;
	for(i=0;i<5;i++)
	{
		pthread_create(&pthid,NULL,pth_work,(void *)&i);
		sleep(1);
	}
	while(1)
	{
		pthread_mutex_lock(&mutex);//上锁
		memcpy(new_addr+i*count,src_addr+i*count,remain);
		pthread_mutex_unlock(&mutex);//解锁
		//取消映射
		munmap(src_addr,statbuf.st_size);
		munmap(new_addr,statbuf.st_size);
		exit(0);//结束进程
	}
}

标签:count,文件,include,addr,int,mutex,pthread,拷贝,多线程
From: https://www.cnblogs.com/yesiming/p/18045615

相关文章

  • 树莓派3B修改根文件系统为f2fs
    目录前言操作简述我的实际操作步骤1.准备2.查看树莓派分区信息3.备份根分区4.格式化树莓派TF卡根分区为f2fs文件系统5.恢复备份前言在TF卡、固态硬盘之类的nand存储介质上,f2fs比起ext4之类的文件系统在性能和寿命上都有较大优化。所以我决定使用f2fs来作为我树莓派3B的根分......
  • Nest.js 大文件分片上传
    文件上传是常见需求,只要指定content-type为multipart/form-data,内容就会以如下图这种形式传递到服务端:服务端再按照multipart/form-data的格式提取数据,就能达到其中的文件。 但是当文件很大的时候,事情变得不一样了假设传一个100M的文件需要三分钟,那么传1G的文件就需要30......
  • java 解压缩文件
    java解压缩文件解压缩zip文件privatestaticfinalintBUFFER_SIZE=2*1024;publicstaticvoidzipUncompress(StringinputFile)throwsException{FilesrcFile=newFile(inputFile);//判断源文件是否存在if(!srcFile.exis......
  • Qt 多线程中使用QTimer和信号、槽 QObject::startTimer: Timers cannot be started fr
    多线程中使用QTimer我们可能在Qt的多线程中使用QTimer中都会遇到一个错误:Cannotcreatechildrenforaparentthatisinadifferentthread.或者QObject::startTimer:TimerscannotbestartedfromanotherthreadQTimer定时器不能在不同的线程中启动。出现这个主要原因......
  • Qt 多线程中使用信号槽的示例
    之前对线程理解得不深入,所以对Qt的线程机制没有搞清楚,今天写一篇文章总结一下,如有错误,欢迎指出。    首先需要理解线程是什么,线程在代码中的表现其实就是一个函数,只不过这个函数和主线程的函数同时运行,写C语言的都知道,一般代码是从main()函数开始运行的,每个线程都有一......
  • easyadmin 无法上传大文件的问题
    <span><aclass="layui-btn"data-upload="file_url"data-upload-number="one"data-upload-exts="exe|msi|rar|zip|7z"data-upload-icon="image"><iclass="fafa-upload"></i>上传&l......
  • 8从源文件到可执行文件
    CPU可以解析和运行的程序形式称为本地代码,也可以叫做机器语言代码。将多个目标文件结合成exe文件的工具称为连接器。扩展名为.obj目标文件的内容是本地代码。把多个目标文件收录在一起,称库文件。仅包含Windows的dll文件中储存的函数信息文件称为导入库在程序运行时用来动态申请......
  • linux服务文件存放位置
    转自:https://wenku.csdn.net/answer/d563a2b1b3f3c4e717cadb694b160ed4Linux中的service文件是一种用于管理系统服务的配置文件,通常位于/etc/systemd/system目录下。这些文件包含了服务的启动、停止、重启等操作的指令,以及服务的相关配置信息,如服务的名称、描述、依赖关系等。......
  • 8-5. 序列化保存数据文件
    安装newtonsoftjsonnewtonsoftjson是一个比JsonUtility更好的JSON工具,但是UnityRegistry没办法直接下载,需要点击PackageManager左上角的+号,点击AddpackagefromgitURL,输入com.unity.nuget.newtonsoft-json,进行安装使用newtonsoftjson序列化和反序列化使......
  • Oracle 12C数据库从文件系统迁移到ASM
     查看参数文件位置SQL>showparameterspfileNAMETYPEVALUE-----------------------------------------------------------------------------spfilestring/u01/app/oracle/product/12.......