多线程文件复制程序(4个线程)

来源:互联网 发布:淘宝链接转微信链接 编辑:程序博客网 时间:2024/05/21 07:54

用法和之前的那个程序一样

 

 

#include<stdio.h>
#include<string.h>
#include<io.h>
#include<omp.h>//使用openmp的头文件
#include<time.h>
#define N 3
#define M 1000
void cp(FILE *S,FILE *d,int l,char tmp[]);
int main(int argc,char *argv[])
{
      FILE *s,*d;
      char tmp[M];
      int i,j;
      __int64 lg,l;
      clock_t t1,t2;//定义两个时间变量,用来计时用的
      l=M;
      t1=clock();
      //printf("%d/n",l);
      if(argc>N)
          {
              printf("参数异常/n");
              return 0;
          }
      if((argc==1)||((argc==N-1)&&(strcmp(argv[argc-1],"/?")==0)))
          {
              printf("eg:hd file1 file2 /n");
              return 0;
          }
      if((s=fopen(argv[1],"rb"))==NULL)
          {
              printf("打开源文件失败/n");
              return 0;
          }
      else
          {
              printf("打开源文件成功/n");
          }
      if((d=fopen(argv[2],"rb"))!=NULL)
          {
              printf("目的文件已存在/n");
              fclose(s);
              fclose(d);
              return 0;
          }
      if((d=fopen(argv[2],"ab"))!=NULL)
          {
              printf("创建目的文件成功/n");
          }
      lg=filelength(fileno(s));
      if(lg<=l)
          {
              //printf("进入lg<=l判断,文件长度为%d个字节/n",lg);
              fread(tmp,sizeof(char),lg,s);
              fwrite(tmp,sizeof(char),lg,d);
              fclose(s);
              fclose(d);
              return 0;
          }
      //printf("%d/n",l);
      i=j=lg/l;
      //printf("/n文件长度%d个字节/n",lg);
      omp_set_num_threads(4);//使用4个线程复制文件
      omp_lock_t mylock;//定义一个线程锁
      omp_init_lock(&mylock);//初始化线程锁
     #pragma omp parallel for //schedule(static)
      for(i=0;i<j;i++)
          {
              //printf("/n当前进入第%d次for循,等待复制文件长度为%d个字节/n",j-i+1,lg-l*i);
              //printf("本次复制文件长度为%d个字节/n",l);
             omp_set_lock(&mylock);//上锁
             cp(s,d,l,tmp);
             omp_unset_lock(&mylock);//解索
          }
      omp_destroy_lock(&mylock);//关闭锁
      l=lg-l*j;
      fread(tmp,sizeof(char),l,s);
      fwrite(tmp,sizeof(char),l,d);
      fclose(s);
      fclose(d);
      t2=clock();
      printf("/n耗时%d毫秒/n",t2-t1);//输出程序运行时间
      return 0;
}
void cp(FILE *s,FILE *d,int l,char tmp[])
{
 fread(tmp,sizeof(char),l,s);
 fwrite(tmp,sizeof(char),l,d);
}

原创粉丝点击