1> 使用两个线程完成两个文件的拷贝,主线程拷贝前一半内容,子线程拷贝后一半内容,并且主线程要阻塞回收子线程资源
#include<myhead.h>
struct file{
FILE *src;
FILE *tar;
long size;
};
//线程体1
void*task1(void *arg){
//线程1代码块
struct file file=*(struct file *)arg;
char arr[file.size];
fread(arr,sizeof(char),file.size/2,file.src);
fwrite(arr,sizeof(char),file.size/2,file.tar);
fflush(file.src);
}
//线程体2
void*task2(void *arg){
//线程2代码块
struct file file=*(struct file*)arg;
char arr[file.size-file.size/2];
fread(arr,sizeof(char),file.size-file.size/2,file.src);
fwrite(arr,sizeof(char),sizeof(arr)/sizeof(char),file.tar);
fflush(file.src);
}
int main(int argc, const char *argv[])
{
pthread_t tid1,tid2;
struct file file;
if((file.src=fopen("src.txt","r"))==NULL){
perror("fopen error");
return -1;
}
if((file.tar=fopen("tar.txt","w"))==NULL){
perror("fopen error");
return -1;
}
fseek(file.src,0,SEEK_END);
file.size=ftell(file.src);
fseek(file.src,0,SEEK_SET);
if(pthread_create(&tid1,NULL,task1,&file)){
printf("创建线程失败\n");
return -1;
}
if(pthread_create(&tid2,NULL,task2,&file)){
printf("创建线程失败\n");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
2> 使用三个进程完成两个文件的拷贝,主线程拷贝前三分之一,子线程1拷贝中间三分之一,子线程2拷贝后三分之一,主线程要设置两个子线程为分离态
#include<myhead.h>
struct file{
FILE *src;
FILE *tar;
int line;
long size;
};
int getLine(FILE *fp)
{
char buf[10];
int line = 0;
while(fgets(buf, sizeof(buf), fp) != NULL){
if(buf[strlen(buf)-1] == '\n'){
line ++;
}
}
return line;
}
void *task1(void *arg)
{
struct file file=*(struct file*)arg;
char arr[file.size];
for(int i=0;i<file.line/3;i++){
fgets(arr,sizeof(arr),file.src);
fputs(arr,file.tar);
}
pthread_exit(NULL);
}
void *task2(void *arg)
{
struct file file=*(struct file*)arg;
char arr[file.size];
for(int i=0;i<file.line-file.line/3*2;i++){
fgets(arr,sizeof(arr),file.src);
fputs(arr,file.tar);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
pthread_t tid1,tid2;
struct file file;
if((file.src=fopen("src.txt","r"))==NULL){
perror("fopen error");
return -1;
}
if((file.tar=fopen("tar.txt","w"))==NULL){
perror("fopen error");
return -1;
}
file.line=getLine(file.src);
fseek(file.src,0,SEEK_END);
file.size=ftell(file.src);
fseek(file.src,0,SEEK_SET);
char arr[file.size];
for(int i=0;i<file.line/3;i++){
fgets(arr,sizeof(arr),file.src);
fputs(arr,file.tar);
}
if(pthread_create(&tid1,NULL,task1,&file)){
printf("创建线程失败\n");
return -1;
}
if(pthread_create(&tid2,NULL,task2,&file)){
printf("创建线程失败\n");
return -1;
}
pthread_detach(tid1);
pthread_detach(tid2);
printf("拷贝中\n");
sleep(1);
printf("拷贝完成\n");
return 0;
}