1、作业要求
2、实现过程
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
typedef struct info{
int fd_r;
int fd_w;
off_t size;
}Info;
//互斥锁
pthread_mutex_t mutex;
void* pthread_c1(void *arg);
void* pthread_c2(void *arg);
int main(int argc, const char *argv[])
{
//打开源文件
int fd_r = open("./1.png",O_RDONLY);
if(fd_r<0){
perror("open");
return -1;
}
//打开目标文件
int fd_w = open("./2.png",O_RDWR|O_CREAT|O_TRUNC,0664);
if(fd_w<0){
perror("open");
return -1;
}
//文件大小
off_t size = lseek(fd_r,0,SEEK_END);
Info msg; //定义结构体变量
msg.fd_r = fd_r;
msg.fd_w = fd_w;
msg.size = size;
//创建互斥锁
pthread_mutex_init(&mutex,NULL);
//创建A线程
pthread_t tid1,tid2;
int res1 = pthread_create(&tid1,NULL,pthread_c1,&msg);
if(res1 != 0){
fprintf(stderr,"线程创建失败\n");
return -1;
}
//创建B线程
int res2 = pthread_create(&tid2,NULL,pthread_c2,&msg);
if(res2 != 0){
fprintf(stderr,"线程创建失败\n");
return -1;
}
//分离线程
// pthread_detach(tid1);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
//销毁互斥锁
pthread_mutex_destroy(&mutex);
//关闭文件
close(fd_r);
close(fd_w);
return 0;
}
//A线程
void* pthread_c1(void *arg){
int fd_r = ((Info*)arg)->fd_r;
int fd_w = ((Info*)arg)->fd_w;
off_t size = ((Info*)arg)->size;
/**********************临界区**********************/
pthread_mutex_lock(&mutex); //互斥锁上锁
//复制前半部分
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
char str[100] = {0};
ssize_t size_also = size/2;
while(1){
ssize_t size_read = size_also/sizeof(str)==0 ? size_also : sizeof(str);
size_t res1 = read(fd_r,str,size_read);
if(res1<0){
perror("read");
//return -1;
}
size_t res2 = write(fd_w,str,res1);
if(res2<0){
perror("write");
//return -1;
}
sif((size_also -= size_read)==0){
break;
}
}
pthread_mutex_unlock(&mutex); //互斥锁解锁
/**********************临界区**********************/
printf("前半部分拷贝完毕\n");
pthread_exit(NULL);
return NULL;
}
//B线程
void* pthread_c2(void *arg){
int fd_r = ((Info*)arg)->fd_r;
int fd_w = ((Info*)arg)->fd_w;
off_t size = ((Info*)arg)->size;
int flag = size%2 != 0;
/**********************临界区**********************/
pthread_mutex_lock(&mutex); //互斥锁上锁
//复制后半部分
lseek(fd_r,size/2,SEEK_SET);
lseek(fd_w,size/2,SEEK_SET);
char str[100] = {0};
int floa = size%2 != 0;
ssize_t size_also = size/2+floa;
while(1){
ssize_t size_read = size_also/sizeof(str)==0 ? size_also : sizeof(str);
size_t res1 = read(fd_r,str,size_read);
if(res1<0){
perror("read");
//return;
}
size_t res2 = write(fd_w,str,res1);
if(res2<0){
perror("write");
//return;
}
if((size_also -= size_read)==0){
break;
}
}
pthread_mutex_unlock(&mutex); //互斥锁解锁
/**********************临界区**********************/
printf("后半部分拷贝完毕\n");
pthread_exit(NULL);
return NULL;
}
3、实现效果