iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >LINUX怎么实现多线程进行cp复制
  • 639
分享到

LINUX怎么实现多线程进行cp复制

2023-06-04 13:06:50 639人浏览 八月长安
摘要

这篇文章主要为大家展示了“linux怎么实现多线程进行cp复制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“LINUX怎么实现多线程进行cp复制”这篇文章吧。关于这个问题,意义虽然有限因为一般来

这篇文章主要为大家展示了“linux怎么实现多线程进行cp复制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“LINUX怎么实现多线程进行cp复制”这篇文章吧。

关于这个问题,意义虽然有限因为一般来说在复制文件的时候,实际的瓶颈来自于I/O,不管开启多少个线程实际上速度并不会快多少,但是为了练习多线程编程
这里给出了一种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
可以看出校验是通过的

代码如下:

点击(此处)折叠或打开

  1. #include<iOStream>

  2. #include <map>

  3. #include<stdint.h>

  4. #include<stdio.h>

  5. #include<string.h>

  6. #include<unistd.h>

  7. #include<sys/types.h>

  8. #include<sys/stat.h>

  9. #include <sys/sysinfo.h>

  10. #include<fcntl.h>

  11. #include<errno.h>

  12. #include <time.h>

  13. #include <stdarg.h>

  14. #include <stdlib.h>

  15. #include <pthread.h>

  16. #define MAX_BUFFER 65536

  17. using namespace std;

  18. pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;

  19. class thread_info

  20. {

  21.         private:

  22.                 uint64_t start_pos;

  23.                 uint64_t end_pos;

  24.                 int fdr;

  25.                 int fdw;

  26.         public:

  27.                 pthread_t t_id;

  28.                 static int do_id;

  29.         public:

  30.                 thread_info()

  31.                 {

  32.                         start_pos = 0;

  33.                         end_pos = 0;

  34.                         fdr = 0;

  35.                         fdw = 0;

  36.                         t_id = 0;

  37.                 }

  38.                 void set_start(uint64_t a)

  39.                 {

  40.                         start_pos = a;

  41.                 }

  42.                 void set_end(uint64_t a)

  43.                 {

  44.                         end_pos = a;

  45.                 }

  46.                 void set_fd(int a,int b)

  47.                 {

  48.                         fdr = a;

  49.                         fdw = b;

  50.                 }

  51.                 uint64_t get_start(void)

  52.                 {

  53.                         return start_pos;

  54.                 }

  55.                 uint64_t get_stop(void)

  56.                 {

  57.                         return end_pos;

  58.                 }

  59.                 int get_fdr(void)

  60.                 {

  61.                         return fdr;

  62.                 }

  63.                 int get_fdw(void)

  64.                 {

  65.                         return fdw;

  66.                 }

  67.                 void print(void)

  68.                 {

  69.                         cout<<start_pos<<":"<<end_pos<<":"<<t_id<<endl;

  70.                 }

  71. };

  72. int thread_info::do_id = 0;

  73. class ABS_dispatch

  74. {

  75.         public:

  76.                 ABS_dispatch()

  77.                 {

  78.                         par_thr = 0;

  79.                         max_cpu = 0;

  80.                 }

  81.                 virtual thread_info* call_thread(void) = 0;

  82.                 virtual void  make_init(uint32_t t_n) = 0;

  83.                 uint32_t getcpu(void)

  84.                 {

  85.                         return get_nprocs() ;

  86.                 }

  87.                 virtual ~ABS_dispatch(){

  88.                 }

  89.         protected:

  90.                 uint32_t par_thr;

  91.                 uint32_t max_cpu;

  92. };

  93. class dispatch:public ABS_dispatch

  94. {

  95.         public:

  96.                 typedef multimap<uint64_t,uint64_t>::iterator pair_piece_iterator;

  97.                 dispatch():ABS_dispatch()

  98.         {

  99.                 file_idr = 0;

  100.                 file_idw = 0;

  101.                 file_size = 0;

  102.                 tread_arr_p = NULL;

  103.         }

  104.                 virtual thread_info* call_thread(void);

  105.                 virtual void  make_init(uint32_t t_n)

  106.                 {

  107.                         max_cpu = getcpu(); //

  108.                         cout<<"Your cpu core is:"<<max_cpu<<"\n";

  109.                         if(t_n > max_cpu) //parallel

  110.                         {

  111.                                 cout<<"Parallel downgrad to cpu core:"<<max_cpu<<"\n";

  112.                                 par_thr = max_cpu;

  113.                         }

  114.                         else

  115.                         {

  116.                                 par_thr = t_n;

  117.                         }

  118.                 }

  119.                 void set_init(int file_idr,int file_idw)

  120.                 {

  121.                         file_size = lseek(file_idr,0,SEEK_END);

  122.                         if(file_size<100000000)

  123.                         {

  124.                                 cout<<"File small than 100M par = 1" <<"\n";

  125.                                 par_thr = 1;

  126.                         }

  127.                         this->file_idr = file_idr;

  128.                         this->file_idw = file_idw;

  129.                 }

  130.                 uint32_t real_par()

  131.                 {

  132.                         return par_thr;

  133.                 }

  134.                 virtual ~dispatch()

  135.                 {

  136.                         pair_piece.clear();

  137.                         delete [] tread_arr_p;

  138.                 }

  139.         private:

  140.                 int file_idr;

  141.                 int file_idw;

  142.                 multimap<uint64_t,uint64_t> pair_piece;

  143.                 uint64_t file_size;

  144.         public:

  145.                 thread_info* tread_arr_p;

  146. };

  147. static void* do_work(void* arGC)

  148. {

  149.         uint64_t b;

  150.         uint64_t e;

  151.         int fdr;

  152.         int fdw;

  153.         char* buffer[MAX_BUFFER]={0};

  154.         thread_info* tread_arr_p;

  155.         uint64_t loopc = 0;

  156.         uint64_t loopc25 = 0;

  157.         uint64_t i = 0;

  158.         int m = 1;

  159.         pthread_t t_id;

  160.         tread_arr_p = static_cast<thread_info*>(argc);

  161.         //临界区 MUTEX

  162.         pthread_mutex_lock(&counter_mutex);

  163.         b = (tread_arr_p+ tread_arr_p->do_id)->get_start();

  164.         e = (tread_arr_p+ tread_arr_p->do_id)->get_stop();

  165.         fdr = (tread_arr_p+ tread_arr_p->do_id)->get_fdr();

  166.         fdw = (tread_arr_p+ tread_arr_p->do_id)->get_fdw();

  167.         t_id = (tread_arr_p+ tread_arr_p->do_id)->t_id ;

  168.         cout<< t_id <<":"<<b<<":"<<e<<":"<<fdr<<":"<<fdw<<"\n";

  169.         tread_arr_p->do_id++;

  170.         pthread_mutex_unlock(&counter_mutex);

  171.         //临界区

  172.         loopc = e/uint64_t(MAX_BUFFER);

  173.         loopc25 = loopc/(uint64_t)4;

  174.         while(i<loopc)

  175.         {

  176.                 if(i == loopc25*m )

  177.                 {

  178.                         cout<< "Copy Thread:"<<t_id<<" work "<<25*m<<"%\n";

  179.                         m++;

  180.                 }

  181.                 memset(buffer,0,MAX_BUFFER);

  182.                 pread(fdr,buffer,MAX_BUFFER,uint64_t(i*MAX_BUFFER));

  183.                 pwrite(fdw,buffer,MAX_BUFFER,uint64_t(i*MAX_BUFFER));

  184.                 i++;

  185.         }

  186.         memset(buffer,0,MAX_BUFFER);

  187.         pread(fdr,buffer,(e-uint64_t(i*MAX_BUFFER)),uint64_t(i*MAX_BUFFER));

  188.         pwrite(fdw,buffer,(e-uint64_t(i*MAX_BUFFER)),uint64_t(i*MAX_BUFFER));

  189.         cout<< "Copy Thread:"<<t_id<<" work Ok!!"<<"\n";

  190.         return NULL;

  191. }

  192. thread_info* dispatch::call_thread()

  193. {

  194.         int i = 0;

  195.         uint64_t temp_size = 0;

  196.         temp_size = file_size/par_thr;

  197.         tread_arr_p = new thread_info[par_thr];

  198.         cout<<"Will Create "<<par_thr<<" Threads\n";

  199.         //cout<<tread_arr_p<<endl;

  200.         //cout<<sizeof(thread_info)<<endl;

  201.         for(i = 0;i<par_thr-1;i++)

  202.         {

  203.                 pair_piece.insert( pair<uint64_t,uint64_t>(temp_size*i,temp_size*(i+1)-1 ));

  204.         }

  205.         pair_piece.insert( pair<uint64_t,uint64_t>(temp_size*i,file_size ));

  206.         i = 1;

  207.         for(pair_piece_iterator it =pair_piece.begin();it !=pair_piece.end() ;it++)

  208.         {

  209.                 //cout<<"--Thread: "<<i<<"\n";

  210.                 //cout<<it->first<<"\n";

  211.                 //cout<<it->second<<"\n";

  212.                 //cout<<tread_arr_p+(i-1)<<endl;

  213.                 (tread_arr_p+(i-1))->set_start(it->first);

  214.                 (tread_arr_p+(i-1))->set_end(it->second);

  215.                 (tread_arr_p+(i-1))->set_fd(file_idr,file_idw);

  216.                 pthread_create(&((tread_arr_p+(i-1))->t_id),NULL,do_work,static_cast<void*>(tread_arr_p));

  217.                 //(tread_arr_p+(i-1))->print();

  218.                 i++;

  219.         }

  220.         return tread_arr_p;

  221. }

  222. int main(int argc,char** argv)

  223. {

  224.         dispatch test;

  225.         thread_info* thread_info_p = NULL;

  226.         uint32_t real_par;

  227.         void *tret;

  228.         int fdr = open(argv[1],O_RDONLY|O_NOFOLLOW);

  229.         int fdw = open(argv[2],O_RDWR|O_CREAT|O_EXCL,0755);

  230.         cout<<"Author: gaopeng QQ:22389860 Blog:Http://blog.itpub.net/7728585\n";

  231.         if(argc<4)

  232.         {

  233.                 cout<<"USAGE:parcp sourcefile destfile paralle\n";

  234.                 return -1;

  235.         }

  236.         if(fdr == -1 || fdw == -1)

  237.         {

  238.                 perror("open readfile:");

  239.                 return -1;

  240.         }

  241.         if(fdw == -1)

  242.         {

  243.                 perror("open wirtefile:");

  244.                 return -1;

  245.         }

  246.         if(sscanf(argv[3],"%u",&real_par) == EOF)

  247.         {

  248.                 perror("sscanf:");

  249.                 return -1;

  250.         }

  251.         cout<<"set parallel:"<<real_par<<"\n";

  252.         //cout<<lseek(fd,0,SEEK_SET) <<endl;

  253.         test.make_init(real_par);

  254.         test.set_init(fdr,fdw);

  255.         real_par = test.real_par();

  256.         cout<<"real parallel:" <<real_par<<"\n";

  257.         thread_info_p = test.call_thread();

  258.         for(int i = 0 ;i<real_par;i++)

  259.         {

  260.                 //cout<<(thread_info_p+i)->t_id<<endl;

  261.                 pthread_join((thread_info_p+i)->t_id,&tret);

  262.                 //cout<<reinterpret_cast<long>(tret)<<endl;

  263.         }

  264.         close(fdw);

  265.         close(fdr);

  266. }

以上是“LINUX怎么实现多线程进行cp复制”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网操作系统频道!

--结束END--

本文标题: LINUX怎么实现多线程进行cp复制

本文链接: https://www.lsjlt.com/news/238105.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • LINUX怎么实现多线程进行cp复制
    这篇文章主要为大家展示了“LINUX怎么实现多线程进行cp复制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“LINUX怎么实现多线程进行cp复制”这篇文章吧。关于这个问题,意义虽然有限因为一般来...
    99+
    2023-06-04
  • Linux中怎么使用cp命令进行强制覆盖
    这篇文章主要介绍“Linux中怎么使用cp命令进行强制覆盖”,在日常操作中,相信很多人在Linux中怎么使用cp命令进行强制覆盖问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中怎么使用cp命令进行强...
    99+
    2023-06-13
  • Java多线程实现复制文件
    本文实例为大家分享了Java多线程实现复制文件的具体代码,供大家参考,具体内容如下 代码实现如下: package com.tulun.thread; import java.i...
    99+
    2024-04-02
  • Linux复制命令cp命令怎么用
    小编给大家分享一下Linux复制命令cp命令怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux系统cp命令主要用于复制文件,可以复制指定目录下的全部文...
    99+
    2023-06-28
  • Node.js 中怎么实现多线程和多进程
    这期内容当中小编将会给大家带来有关Node.js 中怎么实现多线程和多进程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。为什么要用 NodeJSJavaScript 最初...
    99+
    2024-04-02
  • 在Linux系统上怎么进行openmp多线程编程
    这篇文章主要讲解了“在Linux系统上怎么进行openmp多线程编程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在Linux系统上怎么进行openmp多线程编程”吧!  OpenMP是一种...
    99+
    2023-06-13
  • Python进阶之多线程怎么实现
    这篇文章主要介绍“Python进阶之多线程怎么实现”,在日常操作中,相信很多人在Python进阶之多线程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python进阶之多线程怎么实现”的疑惑有所帮助!...
    99+
    2023-07-06
  • python实现多线程post方法进行压
    #coding=utf-8 import httplib,urllib from time import ctime import threading import csv postJson={ } #定义需要...
    99+
    2023-01-31
    多线程 方法 python
  • Lua中怎么进行多线程编程
    在Lua中进行多线程编程可以使用Lua的Coroutine特性来实现。Coroutine是一种协作式多任务处理方式,可以模拟多线程的...
    99+
    2024-04-09
    Lua
  • Nodejs怎么进行多线程处理
    这篇文章主要介绍Nodejs怎么进行多线程处理,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Threads à gogo 是nodejs 的原生模块,使用这个模块可以让nodejs 具备多线程处理功能。【推荐学习:《...
    99+
    2023-06-15
  • Linux下怎么实现shell多线程编程
    本篇内容介绍了“Linux下怎么实现shell多线程编程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  Linux中多线程编程拥有提高应用...
    99+
    2023-06-13
  • Linux下怎么使用cp命令复制文件及复制目录
    本篇内容介绍了“Linux下怎么使用cp命令复制文件及复制目录”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  Linux下cp命令的用法主...
    99+
    2023-06-13
  • java多线程事务控制怎么实现
    在Java中,可以使用以下方法实现多线程事务控制:1. 使用synchronized关键字:将需要进行事务控制的代码块用synchr...
    99+
    2023-10-11
    java
  • C#多线程控制进度条的异步调用怎么实现
    这篇文章主要讲解了“C#多线程控制进度条的异步调用怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#多线程控制进度条的异步调用怎么实现”吧!看看具体的步骤和实现:在上面的代码中,我们...
    99+
    2023-06-17
  • c语言多线程并行怎么实现
    在C语言中,可以使用pthread库来实现多线程并行。1. 首先,需要包含pthread.h头文件。```c#include ```...
    99+
    2023-09-14
    c语言
  • laravel多线程执行队列怎么实现
    在Laravel中,可以使用`illuminate/queue`组件来实现多线程执行队列的功能。首先,需要在项目中安装`illumi...
    99+
    2023-09-06
    laravel
  • java多线程并发执行怎么实现
    在Java中实现多线程的并发执行有多种方式,以下是其中的几种常见方法:1. 继承Thread类:创建一个继承自Thread类的子类,...
    99+
    2023-09-27
    java
  • java中多线程怎么进行通信
    今天就跟大家聊聊有关java中多线程怎么进行通信,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、概要线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线...
    99+
    2023-05-31
    java 多线程通信 ava
  • java怎么实现多线程并发执行
    Java实现多线程并发执行的方式有两种:继承Thread类和实现Runnable接口。 继承Thread类: 定义一个类,继承...
    99+
    2023-10-25
    java
  • python多线程怎么实现动态图绘制
    今天小编给大家分享一下python多线程怎么实现动态图绘制的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、背景有些情况下,...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作