思维导图
三个线程实现文件拷贝
#include
sem_t sem;
//定义用来传递数据的结构体
typedef struct
{
int src;
int dst;
int len;
}CopyInfo;
/*
* function: 按给定的位置和大小拷贝文件
* @param [ in] 源文件描述符 目的文件描述符 拷贝起始位置 拷贝大小
* @param [out]
* @return
*/
int copy_file(int srcfd,int dstfd,int start,int len)
{
lseek(srcfd,start,SEEK_SET);
lseek(dstfd,start,SEEK_SET);
char buf[128]="";
int res=0;
int sum=0;
while(1)
{
res=read(srcfd,buf,sizeof(buf));
sum+=res;
if(sum>=len || res==0)
{
write(dstfd,buf,res-(sum-len));
break;
}
write(dstfd,buf,res);
}
}
/*
* function: 线程1拷贝前半部分内容
* @param [ in]
* @param [out]
* @return
*/
void *task1(void *arg)
{
CopyInfo *info=(CopyInfo *)arg;
copy_file(info->src,info->dst,0,(info->len)/2);
sem_post(&sem);
}
/*
* function: 线程2拷贝后半部分内容
* @param [ in]
* @param [out]
* @return
*/
void *task2(void *arg)
{
CopyInfo *info=(CopyInfo *)arg;
copy_file(info->src,info->dst,(info->len)/2,(info->len)-(info->len)/2);
sem_wait(&sem);
}
int main(int argc, const char *argv[])
{
int srcfd,dstfd;
//打开两个文件
srcfd=open(argv[1],O_RDONLY);
if(srcfd==-1)
{
perror("open srcfile error");
return -1;
}
dstfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);
if(dstfd==-1)
{
perror("open dstfile error");
return -1;
}
//获取文件大小
int len=lseek(srcfd,0,SEEK_END);
//创建两个线程
pthread_t tid1,tid2;
CopyInfo info;
info.src=srcfd;
info.dst=dstfd;
info.len=len;
if(pthread_create(&tid1,NULL,task1,(void *)&info)!=0)
{
perror("create task1 error");
return -1;
}
if(pthread_create(&tid2,NULL,task2,(void *)&info)!=0)
{
perror("create task2 error");
return -1;
}
//等待线程完成
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
close(srcfd);
close(dstfd);
printf("DONE!");
sem_destroy(&sem);
return 0;
}
三个线程打印ABC
#include
sem_t sem1;
sem_t sem2;
void *task1(void *arg) //线程1打印A
{
while(1)
{
sleep(1);
printf("A\n");
sem_post(&sem1);
}
}
void *task2(void *arg) //线程2打印B
{
while(1)
{
sem_wait(&sem1);
printf("B\n");
sem_post(&sem2);
}
}
void *task3(void *arg) //线程3打印C
{
while(1)
{
sem_wait(&sem2);
printf("C\n");
}
}
int main(int argc, const char *argv[])
{
pthread_t tid1,tid2,tid3;
if(pthread_create(&tid1,NULL,task1,NULL)!=0)
{
perror("create task1 error");
return -1;
}
if(pthread_create(&tid2,NULL,task2,NULL)!=0)
{
perror("create task2 error");
return -1;
}
if(pthread_create(&tid3,NULL,task3,NULL)!=0)
{
perror("create task3 error");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}