多线程处理

1、使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源

#include<myhead.h>

struct Buf
{
    int start;//起始位置
    int end;//结束位置
    const char *arr;//源文件
    const char *brr;//目标文件
};
//判断文件长度
int size(const char *arr,const char *brr)
{
    //打开源文件
    int pd1=-1;
    if((pd1=open(arr,O_RDONLY))==-1)
    {
        perror("open error");
        return -1;
    }
    //打开目标文件
    int pd2=-1;
    if((pd2=open(brr,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
    {
        perror("open error");
        return -1;
    }
    int size=lseek(pd1,0,SEEK_END);//求出pd1的文件字符数
    close(pd1);
    close(pd2);
    return size;
}

void *task(void *arg)
{
    //数据读取
    int start=((struct Buf*)arg)->start;
    int end=((struct Buf*)arg)->end;
    const char *arr;
    const char *brr;
    arr=((struct Buf*)arg)->arr;
    brr=((struct Buf*)arg)->brr;
    //printf("%s\n",arr);
    //打开源文件
    int pd1=-1;
    if((pd1=open(arr,O_RDONLY))==-1)
    {
        perror("open error");
        pthread_exit(NULL);
    }
    //打开目标文件
    int pd2=-1;
    if((pd2=open(brr,O_WRONLY))==-1)
    {
        perror("open error");
        pthread_exit(NULL);
    }
    //偏移位置
    lseek(pd1, start, SEEK_SET);
    lseek(pd2, start, SEEK_SET);
    //定义搬运工
    char buf[128]="";
    //定义读取数量
    int sum=start;
    while(1)
    {
        int src=read(pd1,buf,sizeof(buf));//读取
        sum+=src;//记录读取个数
        if(src==0||sum>end)//退出条件
        {
            write(pd2,buf,src-sum+end);
            break;
        }
        write(pd2,buf,src);
    }
    pthread_exit(NULL);
}

int main(int argc,const char *argv[])
{
    //判断文件数量
    if(argc!=3)
    {
        printf("input_file error\n");
        return -1;
    }
    //判断文件长度
    int len=size(argv[1],argv[2]);
    printf("%d\n",len);
    //将数据写入结构体内部
    struct Buf buf1={0,len-len/2,argv[1],argv[2]};
    struct Buf buf2={len/2,len,argv[1],argv[2]};
    //创建线程1
    pthread_t pid1=0;
    if(pthread_create(&pid1,NULL,task,&buf1)!=0)
    {
        printf("pthread_create error\n");
        return 0;
    }
    
    //创建线程2
    pthread_t pid2=0;
    if(pthread_create(&pid2,NULL,task,&buf2)!=0)
    {
        printf("pthread_create error\n");
        return 0;
    }
    //分离
    pthread_join(pid1,NULL);
    pthread_join(pid2,NULL);
    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值