1、使用多线程完成两个文件的拷贝,第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程的资源
代码:
#include<myhead.h>
//定义文件拷贝函数
int copy_file(int start,int len)
{
int srcfd,destfd;
//以只读的形式打卡源文件
if((srcfd=open("./picture.bmp",O_RDONLY))==-1)
{
perror("open srcfile error");
return -1;
}
//以只写形式打开目标文件
if((destfd=open("./cp.bmp",O_WRONLY|O_CREAT,0664))==-1)
{
perror("open destfile error");
return -1;
}
//移动光标
lseek(srcfd,start,SEEK_SET);
lseek(destfd,start,SEEK_SET);
//进行拷贝
char buf[128]="";
int sum=0;
while(1)
{
int res=read(srcfd,buf,sizeof(buf));
sum+=res; //每次读写的数据量放入到sum中
//判断读取进度
if(sum>=len||res==0)
{
//写入最后一次内容
write(destfd,buf,res-(sum-len));
break;
}
//将数据放入目标文件
write(destfd,buf,res);
}
//关闭文件
close(srcfd);
close(destfd);
return 0;
}
//定义分支线程
void *task2(void *arg)
{
//分支线程从中间进行复制
copy_file((*(int *)arg)/2,(*(int *)arg)-(*(int *)arg)/2);
pthread_exit(NULL);
}
void *task1(void *arg)
{
//分支线程从头进行复制
copy_file(0,(*(int *)arg)/2);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//计算数据
int fd=-1;
if((fd=open("./picture.bmp",O_RDONLY))==-1)
{
perror("open error");
return -1;
}
int len=lseek(fd,0,SEEK_END);
close(fd);
//创建分支线程
pthread_t tid1;
if(pthread_create(&tid1,NULL,task1,&len)!=0)
{
printf("tid1 creat error\n");
return -1;
}
pthread_t tid2;
if(pthread_create(&tid2,NULL,task2,&len)!=0)
{
printf("tid2 creat error\n");
return -1;
}
//回收资源
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
printf("copy success\n");
return 0;
}
运行结果:
思维导图: