LINUX 如何实现多线程进行cp复制
这里给出了一种C++代码实现的方式,代码附在最后。
实际上就是将一个文件分割为多个片段,开启多个线程进行同时复制,如果用户制定的并行大于服务器实际的CPU核数,程序会自动降级并行度为CPU核数,如果文件小于
100M则并行度始终为1。
root@bogon:/home/gaopeng/mmm# ./parcp log.log log10.log 2
set parallel:2
Your cpu core is:4
real parallel:2
Will Create 2 Threads
140677902710528:0:174522367:3:4
140677894317824:174522368:349044736:3:4
Copy Thread:140677902710528 work 25%
Copy Thread:140677894317824 work 25%
Copy Thread:140677902710528 work 50%
Copy Thread:140677902710528 work 75%
Copy Thread:140677902710528 work 100%
Copy Thread:140677902710528 work Ok!!
Copy Thread:140677894317824 work 50%
Copy Thread:140677894317824 work 75%
Copy Thread:140677894317824 work Ok!!
复制完成后进行md5验证
root@bogon:/home/gaopeng/mmm# md5sum log.log
f64acc21f7187a865938b340b3eda198 log.log
root@bogon:/home/gaopeng/mmm# md5sum log10.log
f64acc21f7187a865938b340b3eda198 log10.log
可以看出校验是通过的
代码如下:
点击(此处)折叠或打开
- #include<iostream>
- #include <map>
- #include<stdint.h>
- #include<stdio.h>
- #include<string.h>
- #include<unistd.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include <sys/sysinfo.h>
- #include<fcntl.h>
- #include<errno.h>
- #include <time.h>
- #include <stdarg.h>
- #include <stdlib.h>
- #include <pthread.h>
- #define MAX_BUFFER 65536
- using namespace std;
- pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;
- class thread_info
- {
- private:
- uint64_t start_pos;
- uint64_t end_pos;
- int fdr;
- int fdw;
- public:
- pthread_t t_id;
- static int do_id;
- public:
- thread_info()
- {
- start_pos = 0;
- end_pos = 0;
- fdr = 0;
- fdw = 0;
- t_id = 0;
- }
- void set_start(uint64_t a)
- {
- start_pos = a;
- }
- void set_end(uint64_t a)
- {
- end_pos = a;
- }
- void set_fd(int a,int b)
- {
- fdr = a;
- fdw = b;
- }
- uint64_t get_start(void)
- {
- return start_pos;
- }
- uint64_t get_stop(void)
- {
- return end_pos;
- }
- int get_fdr(void)
- {
- return fdr;
- }
- int get_fdw(void)
- {
- return fdw;
- }
- void print(void)
- {
- cout<<start_pos<<":"<<end_pos<<":"<<t_id<<endl;
- }
- };
- int thread_info::do_id = 0;
- class ABS_dispatch
- {
- public:
- ABS_dispatch()
- {
- par_thr = 0;
- max_cpu = 0;
- }
- virtual thread_info* call_thread(void) = 0;
- virtual void make_init(uint32_t t_n) = 0;
- uint32_t getcpu(void)
- {
- return get_nprocs() ;
- }
- virtual ~ABS_dispatch(){
- }
- protected:
- uint32_t par_thr;
- uint32_t max_cpu;
- };
- class dispatch:public ABS_dispatch
- {
- public:
- typedef multimap<uint64_t,uint64_t>::iterator pair_piece_iterator;
- dispatch():ABS_dispatch()
- {
- file_idr = 0;
- file_idw = 0;
- file_size = 0;
- tread_arr_p = NULL;
- }
- virtual thread_info* call_thread(void);
- virtual void make_init(uint32_t t_n)
- {
- max_cpu = getcpu(); //
- cout<<"Your cpu core is:"<<max_cpu<<"\n";
- if(t_n > max_cpu) //parallel
- {
- cout<<"Parallel downgrad to cpu core:"<<max_cpu<<"\n";
- par_thr = max_cpu;
- }
- else
- {
- par_thr = t_n;
- }
- }
- void set_init(int file_idr,int file_idw)
- {
- file_size = lseek(file_idr,0,SEEK_END);
- if(file_size<100000000)
- {
- cout<<"File small than 100M par = 1" <<"\n";
- par_thr = 1;
- }
- this->file_idr = file_idr;
- this->file_idw = file_idw;
- }
- uint32_t real_par()
- {
- return par_thr;
- }
- virtual ~dispatch()
- {
- pair_piece.clear();
- delete [] tread_arr_p;
- }
- private:
- int file_idr;
- int file_idw;
- multimap<uint64_t,uint64_t> pair_piece;
- uint64_t file_size;
- public:
- thread_info* tread_arr_p;
- };
- static void* do_work(void* argc)
- {
- uint64_t b;
- uint64_t e;
- int fdr;
- int fdw;
- char* buffer[MAX_BUFFER]={0};
- thread_info* tread_arr_p;
- uint64_t loopc = 0;
- uint64_t loopc25 = 0;
- uint64_t i = 0;
- int m = 1;
- pthread_t t_id;
- tread_arr_p = static_cast<thread_info*>(argc);
- //临界区 MUTEX
- pthread_mutex_lock(&counter_mutex);
- b = (tread_arr_p+ tread_arr_p->do_id)->get_start();
- e = (tread_arr_p+ tread_arr_p->do_id)->get_stop();
- fdr = (tread_arr_p+ tread_arr_p->do_id)->get_fdr();
- fdw = (tread_arr_p+ tread_arr_p->do_id)->get_fdw();
- t_id = (tread_arr_p+ tread_arr_p->do_id)->t_id ;
- cout<< t_id <<":"<<b<<":"<<e<<":"<<fdr<<":"<<fdw<<"\n";
- tread_arr_p->do_id++;
- pthread_mutex_unlock(&counter_mutex);
- //临界区
- loopc = e/uint64_t(MAX_BUFFER);
- loopc25 = loopc/(uint64_t)4;
- while(i<loopc)
- {
- if(i == loopc25*m )
- {
- cout<< "Copy Thread:"<<t_id<<" work "<<25*m<<"%\n";
- m++;
- }
- memset(buffer,0,MAX_BUFFER);
- pread(fdr,buffer,MAX_BUFFER,uint64_t(i*MAX_BUFFER));
- pwrite(fdw,buffer,MAX_BUFFER,uint64_t(i*MAX_BUFFER));
- i++;
- }
- memset(buffer,0,MAX_BUFFER);
- pread(fdr,buffer,(e-uint64_t(i*MAX_BUFFER)),uint64_t(i*MAX_BUFFER));
- pwrite(fdw,buffer,(e-uint64_t(i*MAX_BUFFER)),uint64_t(i*MAX_BUFFER));
- cout<< "Copy Thread:"<<t_id<<" work Ok!!"<<"\n";
- return NULL;
- }
- thread_info* dispatch::call_thread()
- {
- int i = 0;
- uint64_t temp_size = 0;
- temp_size = file_size/par_thr;
- tread_arr_p = new thread_info[par_thr];
- cout<<"Will Create "<<par_thr<<" Threads\n";
- //cout<<tread_arr_p<<endl;
- //cout<<sizeof(thread_info)<<endl;
- for(i = 0;i<par_thr-1;i++)
- {
- pair_piece.insert( pair<uint64_t,uint64_t>(temp_size*i,temp_size*(i+1)-1 ));
- }
- pair_piece.insert( pair<uint64_t,uint64_t>(temp_size*i,file_size ));
- i = 1;
- for(pair_piece_iterator it =pair_piece.begin();it !=pair_piece.end() ;it++)
- {
- //cout<<"--Thread: "<<i<<"\n";
- //cout<<it->first<<"\n";
- //cout<<it->second<<"\n";
- //cout<<tread_arr_p+(i-1)<<endl;
- (tread_arr_p+(i-1))->set_start(it->first);
- (tread_arr_p+(i-1))->set_end(it->second);
- (tread_arr_p+(i-1))->set_fd(file_idr,file_idw);
- pthread_create(&((tread_arr_p+(i-1))->t_id),NULL,do_work,static_cast<void*>(tread_arr_p));
- //(tread_arr_p+(i-1))->print();
- i++;
- }
- return tread_arr_p;
- }
- int main(int argc,char** argv)
- {
- dispatch test;
- thread_info* thread_info_p = NULL;
- uint32_t real_par;
- void *tret;
- int fdr = open(argv[1],O_RDONLY|O_NOFOLLOW);
- int fdw = open(argv[2],O_RDWR|O_CREAT|O_EXCL,0755);
- cout<<"Author: gaopeng QQ:22389860 Blog:http://blog.itpub.net/7728585\n";
- if(argc<4)
- {
- cout<<"USAGE:parcp sourcefile destfile paralle\n";
- return -1;
- }
- if(fdr == -1 || fdw == -1)
- {
- perror("open readfile:");
- return -1;
- }
- if(fdw == -1)
- {
- perror("open wirtefile:");
- return -1;
- }
- if(sscanf(argv[3],"%u",&real_par) == EOF)
- {
- perror("sscanf:");
- return -1;
- }
- cout<<"set parallel:"<<real_par<<"\n";
- //cout<<lseek(fd,0,SEEK_SET) <<endl;
- test.make_init(real_par);
- test.set_init(fdr,fdw);
- real_par = test.real_par();
- cout<<"real parallel:" <<real_par<<"\n";
- thread_info_p = test.call_thread();
- for(int i = 0 ;i<real_par;i++)
- {
- //cout<<(thread_info_p+i)->t_id<<endl;
- pthread_join((thread_info_p+i)->t_id,&tret);
- //cout<<reinterpret_cast<long>(tret)<<endl;
- }
- close(fdw);
- close(fdr);
- }
如果觉得不错 您可以考虑请作者喝杯茶(微信支付): 作者微信号:
LINUX 如何实现多线程进行cp复制相关推荐
- Linux学习(4)---cp(复制命令)
CP(复制命令) 1.复制档案 一.常用cp操作 二.复制档案的权限 2.复制目录 CP(复制命令) 不言而喻,复制功能是我们管理文件的重要手段之一. 在图形化界面上轻轻点击鼠标即可完成,而在Linu ...
- Linux CentOS 复制文件、替换文件 cp 复制文件、cp 覆盖文件 cp替换文件
Linux CentOS 复制文件.替换文件 cp 复制文件.cp 覆盖文件 cp替换文件 一.Linux 复制文件语法 1. cp [option] src dest 2. option 可选参数 ...
- linux下的拷贝(cp)、删除(rm)、剪切(mv)命令
linux下的拷贝(cp).删除(rm).剪切(mv)命令 2010-02-03 10:38 cp命令 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,就如同DOS下的copy命令一样,功能非 ...
- linux下文件操作之cp和mv
Linux CP文件夹略过目录的解决 root@QGY:/home/qgy# cp image/newimage_raw /mnt/4T/qin/ cp: 略过目录'image/newimage_ra ...
- linux命令cp -a,linux命令_ls命令与cp命令详解(一)
linux命令_ls命令与cp命令详解(1) 最近想详细熟悉下linux命令,学习笔记记录下: 今天主要学习的是目录操作,下面给大家介绍一下今天学到的几个命令: 1.ls命令 功能:显示文件或者目录信 ...
- cp——复制文件\文件夹
cp--复制文件\文件夹 1.作用 cp命令来自英文单词:copy 用于复制文件\文件夹 2.语法 cp [-r] 参数1 参数2 -r选项,可选,用于复制文件夹使用,表示递归 参数1,Linux路径 ...
- 嵌入式linux防复制,嵌入式linux /dev 下的文件无法复制
嵌入式linux /dev 下的文件无法复制 关注:234 答案:4 mip版 解决时间 2021-02-06 06:27 提问者一段小時光 2021-02-06 00:38 root下也有文件不 ...
- Linux环境编程--多线程
本文作者: 姚继锋 (2001-08-11 09:05:00) 时隔多年 原文地址已经无从查... 居然是2001年就写了 今天看来对初学者还是很有参考意义 所以特转给大家 本人在原文基础 ...
- cp复制文件和目录的使用举例
cp - copy files and directories (cp复制文件和目录) cp [OPTION]... [-T] SOURCE DEST (选项) (源目标) cp [OP ...
最新文章
- python培训班哪些比较好-python培训机构哪家比较好?
- RabbitMQ 一二事(2) - 工作队列使用
- python查找指定文件路径_Python寻找路径和查找文件路径的示例
- 武鸣高中2021高考成绩查询,2019年广西两大重点高中成绩大比拼
- JSON格式以及基本用法
- vue - 父子组件通信之$emit传多个参数
- hivesql优化的深入解析
- mex文件用matlab能打开吗,matlab中mex文件编译运行的问题
- nacos当配置中心读取其他配置文件_SpringBoot+Nacos实现配置中心
- UVA 11825 Hackers' Crackdown 状态DP
- ROS笔记(9) launch文件
- Spring MVC JSR-303验证框架之Hibernate-Validator
- wps 选择 高亮_简单实用:一组WPS表格技巧
- 2021-06-27面向对象继承
- 会计初级可以自己报名吗_2019初级会计职称考试报名流程全攻略
- Design1.CMOS工艺OD门,传输门,三态门原理应用浅析
- 戒指戴在不同手指上的含义
- mysql怎么查询不是张姓的_mysql 中的常用查询
- 军队文职(数学2+物理)——高等数学 3、求极限(一)
- 武汉地铁站点最短路径搜索的实现(一)——Dijkstra算法(C++ coding)