IO:多线程实现文件拷贝

1.多线程实现两个文件拷贝,第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程资源

程序代码:

  1 #include<myhead.h>
  2 //定义要传递的结构体类型
  3 typedef struct
  4 {
  5     const char *src;//原文件地址
  6     const char *dest;//目标文件地址
  7     int start;//光标起始位置
  8     int len;//拷贝长度
  9 }Bran;
 10 int get_len(const char *srcfile,const char *destfile);
 11 int copy_file(const char *srcfile,const char *destfile,int start,int len);
 12 void *task(void *arg);
 13 int main(int argc, const char *argv[])
 14 {
 15     //判断外部传参个数
 16     if(argc!=3)
 17     {
 18         printf("input error\n");
 19         printf("usage:./a.out srcfile destfile\n");
 20         return -1;
 21     }
 22     //定义变量获取文件长度
 23     int len=get_len(argv[1],argv[2]);
 24     //定义线程号变量
 25     pthread_t tid1,tid2;
 26     //定义结构体数组存储,分支进程需要的参数
 27     Bran t[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,(len-len/2)}};
 28     //创建两个线程
 29     if(pthread_create(&tid1,NULL,task,(void*)&t[0])!=0)
 30     {
 31         printf("tid1 create error\n");
 32         return -1;
 33     }
 34 
 35     if(pthread_create(&tid2,NULL,task,(void*)&t[1])!=0)
 36     {
 37         printf("tid2 create error\n");
 38         return -1;
 39     }
 40     //回收线程资源
 41     pthread_join(tid1,NULL);
 42     pthread_join(tid2,NULL);
 43     printf("success\n");
 44     return 0;
 45 }
 46 //获取文件长度
 47 int get_len(const char *srcfile,const char *destfile)
 48 {
 49     //定义两个文件描述符变量
 50     int srcfd,destfd;
 51     //以只读形式打开源文件
 52     if((srcfd=open(srcfile,O_RDONLY))==-1)
 53     {
 54         perror("open srcfile error");
 55         return -1;
 56     }
 57     //以只写形式打开目标文件
 58     if((destfd=open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
 59     {
 60         perror("open destfile error");
 61         return -1;
 62     }
 63     //求文件大小
 64     int len=lseek(srcfd,0,SEEK_END);
 65     //关闭两个文件
 66     close(srcfd);
 67     close(destfd);
 68     return len;
 69 }
 70 //定义拷贝函数
 71 int copy_file(const char *srcfile,const char *destfile,int start,int len)
 72 {
 73     //定义两个文件描述符变量
 74     int srcfd,destfd;
 75     //以只读形式打开源文件
 76     if((srcfd=open(srcfile,O_RDONLY))==-1)
 77     {
 78         perror("open srcfile error");
 79         return -1;
 80     }
 81     //以只写形式打开目标文件
 82     if((destfd=open(destfile,O_WRONLY))==-1)
 83     {
 84         perror("open destfile error");
 85         return -1;
 86     }
 87     //移动文件光标
 88     lseek(srcfd,start,SEEK_SET);
 89     lseek(destfd,start,SEEK_SET);
 90     //拷贝
 91     char buf[128]="";
 92     int sum=0;
 93     while(1)
 94     {
 95         int res=read(srcfd,buf,sizeof(buf));
 96         sum+=res;
 97         if(sum>=len||res==0)
 98         {
 99             write(destfd,buf,res-(sum-len));//读取最后多余的数据写入文件
100             break;
101         }
102         //读取数据写入文件
103         write(destfd,buf,res);
104     }
105     //关闭文件
106     close(srcfd);
107     close(destfd);
108     return 0;
109 }
110 //分支线程函数
111 void *task(void *arg)
112 {
113     Bran t=*(Bran *)arg;
114     //分支线程拷贝后一半
115     copy_file(t.src,t.dest,t.start,t.len);
116     //退出线程
117     pthread_exit(NULL);
118 }   

运行结果:

流程图:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。 目 录 第1部分C++ 多线程系统编程 第1章线程安全的对象生命期管理3 1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . . . . . . . . . . . . . . . 4 1.1.3一个线程安全的Counter 示例.. . . . . . . . . . . . . . . . . . . 4 1.2对象的创建很简单. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 5 1.3销毁太难. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 7 1.3.1mutex 不是办法. . . . . . . . . . . . . . . . . . . .. . . . . . . . 7 1.3.2作为数据成员的mutex 不能保护析构.. . . . . . . . . . . . . . 8 1.4线程安全的Observer 有多难.. . . . . . . . . . . . . . . . . . . . . . . . 8 1.5原始指针有何不妥. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 11 1.6神器shared_ptr/weak_ptr . . . . . . . . . .. . . . . . . . . . . . . . . . 13 1.7插曲:系统地避免各种指针错误. . . . . . . . . . . . . . . . .. . . . . . 14 1.8应用到Observer 上.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9再论shared_ptr 的线程安全.. . . . . . . . . . . . . . . . . . . . . . . . 17 1.10shared_ptr 技术与陷阱. . . .. . . . . . . . . . . . . . . . . . . . . . . . 19 1.11对象池. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 21 1.11.1enable_shared_from_this . . . . . . . . . . . . . . . . . . . . . . 23 1.11.2弱回调. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 24 1.12替代方案. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 26 1.13心得与小结. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 26 1.14Observer 之谬. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 第2章线程同步精要 2.1互斥器(mutex). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.1.1只使用非递归的mutex . . . . . . . . . . . . . .. . . . . . . . . . 33 2.1.2死锁. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 35 2.2条件变量(condition variable). . . . . . . . . .
文件拷贝实例源码,学习关于IO文件流、多线程相关使用做参考。 private void button4_Click(object sender, EventArgs e) { this.progressBar1.Value = 0; this.label1.Text = "0%"; if (!File.Exists(this.textBox1.Text)) { MessageBox.Show("找不到目标文件!"); return; } if (!Directory.Exists(this.textBox2.Text)) { MessageBox.Show("请选择有效的保存路径!"); return; } string fileRead = this.textBox1.Text; string fileSave = Path.Combine(this.textBox2.Text, _fileName); System.Threading.ThreadPool.QueueUserWorkItem((o) => { using (IDisposable file = new FileStream(fileRead, FileMode.Open, FileAccess.Read), fileWrite = new FileStream(fileSave, FileMode.Create, FileAccess.Write)) { int count = 0; long fileLength =((FileStream)file).Length; //目标文件大小 //根据目标文件大小创建byte数组长度 byte[] data = new byte[fileLength > 1024 * 1024 * 30 ? 1024 * 1024 * 30 : fileLength]; //30M 1024 * 1024 * 30 int step = (int)Math.Ceiling(fileLength * 1.0 / data.Length); //分流段数 double n = (100 * 1.0 / step); //每次进度条累加 double m = 0; //累加统计 int spam = 1; //时间间隔 double speed = 0; //拷贝速度 do { DateTime time = DateTime.Now; //文件流操作 count = ((FileStream)file).Read(data, 0, data.Length); ((FileStream)fileWrite).Write(data, 0, count); //保存时间间隔,单位毫秒 spam = (DateTime.Now - time).Milliseconds > 0 ? (DateTime.Now - time).Milliseconds : spam;//必须大于0 //计算速度 单位k/s

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值