嵌入式学习-IO进程线程-Day5
一、思维导图
二、作业
1.使用三个线程完成两个文件的拷贝,线程1完成拷贝前一半,线程2完成拷贝后一半,主线程回收两个分支线程的资源
#include <myhead.h>
void *task1(void *arg);
void *task2(void *arg);
int get_len(const char *srcfile,const char *dstfile);
int copy_file(const char* srcfile,const char*dstfile,int start,int len);
typedef struct Info
{
const char* src;
const char* dest;
int start;
int len;
}info_t;
int main(int argc, const char *argv[])
{
//定义线程
pthread_t tid1;
pthread_t tid2;
//判断外部传参
if(argc!=3)
{
printf("input error\n");
printf("usage: ./a.out inputfile outfile\n");
return -1;
}
//获取长度
int len=get_len(argv[1],argv[2]);
//定义机构体变量
info_t file[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,(len-len/2)}};
//创建第一个线程
if(pthread_create(&tid1,NULL,task1,(void*)&file[0])!=0)
{
printf("create thread1 error\n");
return -1;
}
//创建第二个线程
if(pthread_create(&tid2,NULL,task2,(void*)&file[1])!=0)
{
printf("create thread2 error\n");
return -1;
}
//主线程回收两个线程
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
//第一个线程拷贝上半部分
void *task1(void *arg)
{
info_t f=*(info_t *)arg; //将传入的数据解析出来
copy_file(f.src,f.dest,f.start,f.len);
printf("上半部分拷贝完成\n");
pthread_exit(NULL);
}
//第二个线程拷贝下半部分
void *task2(void *arg)
{
info_t f=*(info_t *)arg;
copy_file(f.src,f.dest,f.start,f.len);
printf("下半部分拷贝完成\n");
pthread_exit(NULL);
}
//计算文件长度函数
int get_len(const char *srcfile,const char *dstfile)
{
int srcfd=-1;
int dstfd=-1;
if((srcfd=open(srcfile,O_RDONLY))==-1)
{
printf("srcfile open error\n");
return -1;
}
if((dstfd=open(dstfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
printf("dstfile open error\n");
return -1;
}
int len=lseek(srcfd,0,SEEK_END);
close(srcfd);
close(dstfd);
return len;
}
//拷贝函数
int copy_file(const char* srcfile,const char*dstfile,int start,int len)
{
int srcfd=-1;int dstfd=-1;
char buf[10];
int count=0;
if((srcfd=open(srcfile,O_RDONLY))==-1)
{
perror("srcfile open error");
return -1;
}
if((dstfd=open(dstfile,O_WRONLY))==-1)
{
perror("dstfile open error");
return -1;
}
lseek(srcfd,start,SEEK_SET);
lseek(dstfd,start,SEEK_SET);
while(1)
{
int res=read(srcfd,buf,sizeof(buf));
write(dstfd,buf,res);
count+=res;
if(count>=len || res==0)
break;
}
return 0;
}
运行结果
2.使用三个线程完成:线程1输出字符’A’,线程2输出字符’B’,线程3输出字符’C’,要求输出结果为:ABCABCABCABCABC…
#include <myhead.h>
//1.创建无名信号量
sem_t sem_a,sem_b,sem_c;
//分支线程1
void *task1(void* arg)
{
while(1)
{
sem_wait(&sem_c);//申请C的资源
printf("A");
sem_post(&sem_a);//释放A的资源
}
}
//分支线程2
void *task2(void *arg)
{
while(1)
{
sem_wait(&sem_a);//申请A的资源
printf("B");
sem_post(&sem_b);//释放B的资源
}
}
//分支线程3
void *task3(void *arg)
{
while(1)
{
sem_wait(&sem_b);//申请B的资源
printf("C\n");
sem_post(&sem_c);//释放C的资源
sleep(1);
}
}
int main(int argc, const char *argv[])
{
//2.初始化无名信号量
sem_init(&sem_a,0,0);
sem_init(&sem_b,0,0);
sem_init(&sem_c,0,1);//初始化c的资源为1
//创建线程1
pthread_t tid1;
if(pthread_create(&tid1,NULL,task1,NULL)!=0)
{
printf("pthread1 create error\n");
return -1;
}
//创建线程2
pthread_t tid2;
if(pthread_create(&tid2,NULL,task2,NULL)!=0)
{
printf("pthread2 create error\n");
return -1;
}
//创建线程3
pthread_t tid3;
if(pthread_create(&tid3,NULL,task3,NULL)!=0)
{
printf("pthread3 create error\n");
return -1;
}
while(1);
//主线程回收线程
//pthread_join(tid1,NULL);
//pthread_join(tid2,NULL);
//pthread_join(tid3,NULL);
sem_destroy(&sem_a);
sem_destroy(&sem_b);
sem_destroy(&sem_c);
return 0;
}
运行结果