创建两个线程:其中一个线程拷贝前半部分,另一个线程拷贝后半部分
只允许开一份资源,且用互斥锁方式实现。
#include <head.h>
//创建传输数据结构体
typedef struct
{
int fd_r;
int fd_w;
off_t size;
}Trans;
pthread_mutex_t lock;
//线程函数定义
void *Athread(void *arg);
void *Bthread(void *arg);
//---------------------------------主函数---------------------------
int main(int argc, const char *argv[])
{
//打开读文件
int fd_r=open("/mnt/hgfs/share/vvv.png",O_RDONLY);
if(fd_r<0)
{
ERR_MSG("open");
return -1;
}
printf("open success\n");
//打开写文件
int fd_w=open("1.png",O_WRONLY|O_CREAT|O_TRUNC,0664);
if(fd_w<0)
{
ERR_MSG("open");
return -1;
}
printf("open success\n");
//初始化变量
off_t size=lseek(fd_r,0,SEEK_END);
pthread_t Atid=0;
pthread_t Btid=0;
int t_f=-1;
//创建互斥锁
pthread_mutex_init(&lock,NULL);
//准备传参数据
Trans Tothread={fd_r,fd_w,size};
//创建线程A
t_f=pthread_create(&Atid,NULL,Athread,&Tothread);
if(t_f!=0)
{
printf("thread A create failed\n");
return -1;
}
//创建线程B
t_f=pthread_create(&Btid,NULL,Bthread,&Tothread);
if(t_f!=0)
{
printf("thread B create failed\n");
return -1;
}
//破坏互斥锁
pthread_join(Atid,NULL);
pthread_join(Btid,NULL);
pthread_mutex_destroy(&lock);
//关闭读文件
if(close(fd_r)<0)
{
ERR_MSG("close");
return -1;
}
printf("close success\n");
//关闭写文件
if(close(fd_w)<0)
{
ERR_MSG("close");
return -1;
}
printf("close success\n");
return 0;
}
//------------------------------线程A-------------------------------
void *Athread(void *arg)
{
//获取传递参数
int fd_r=((Trans *)arg)->fd_r;
int fd_w=((Trans *)arg)->fd_w;
off_t size=((Trans *)arg)->size;
//初始化参数
char tmp=0;
off_t pos=0;
//上锁
pthread_mutex_lock(&lock);
//偏移量移至文件开头
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
//读写文件前半部分文件
while(1)
{
int res=read(fd_r,&tmp,1);
pos+=res;
write(fd_w,&tmp,1);
if((size/2)==pos)
{
printf("top of file has been written\n");
break;
}
}
//前半部分写完毕解锁
pthread_mutex_unlock(&lock);
pthread_exit(NULL);
}
//------------------------------线程B-------------------------------
void *Bthread(void *arg)
{
//获取传递参数
int fd_r=((Trans *)arg)->fd_r;
int fd_w=((Trans *)arg)->fd_w;
off_t size=((Trans *)arg)->size;
//初始化参数
char tmp=0;
off_t pos=size/2;
//上锁
pthread_mutex_lock(&lock);
//偏移量移至文件中间
lseek(fd_r,pos,SEEK_SET);
lseek(fd_w,pos,SEEK_SET);
//读写文件前半部分文件
while(1)
{
int res=read(fd_r,&tmp,1);
pos+=res;
write(fd_w,&tmp,1);
if(size==pos)
{
printf("back of file has been written\n");
break;
}
}
//后半部分写完毕解锁
pthread_mutex_unlock(&lock);
pthread_exit(NULL);
}