1.思维导图
2.将互斥机制代码重新实现一遍
#include <myhead.h>
//创建字符串常量
char buf[128];
//创建一个互斥锁
pthread_mutex_t mutex;
//定义分支进程
void *task(void *arg)
{
while(1)
{
//获取锁资源
pthread_mutex_lock(&mutex);
printf("这是分支线程的值:%s\n",buf);
strcpy(buf,"你好世界\n");
//释放锁资源
pthread_mutex_unlock(&mutex);
}
}
int main(int argc, const char *argv[])
{
//定义线程号变量
pthread_t tid;
//初始化互斥锁
pthread_mutex_init(&mutex,NULL);
//创建线程
if(pthread_create(&tid,NULL,task,NULL)!=0)
{
printf("pthread_create error\n");
return -1;
}
//主线程
while(1)
{
//获取锁资源
pthread_mutex_lock(&mutex);
printf("这是主线程的值:%s\n",buf);
strcpy(buf,"未来再见\n");
//释放锁资源
pthread_mutex_unlock(&mutex);
}
//将线程设置为分离态
pthread_detach(tid);
//销毁锁资源
pthread_mutex_destroy(&mutex);
return 0;
}
3.将同步机制代码重新实现一遍
#include <myhead.h>
//定义无名信号量
sem_t sem;
//创建分支线程1
void *task1(void *arg)
{
while(1)
{
sleep(2);
printf("大妈拿出了一个烧饼\n");
sem_post(&sem);
}
}
//创建分支线程2
void *task2(void *arg)
{
while(1)
{
sem_wait(&sem);
printf("小孩吃了一个烧饼\n");
}
}
/********主程序********/
int main(int argc, const char *argv[])
{
//定义两个线程号
pthread_t tid1,tid2;
//初始化无名信号量
sem_init(&sem,0,0);
//创建生产者线程
if(pthread_create(&tid1,NULL,task1,NULL)!=0)
{
printf("tid1 create error\n");
return -1;
}
//创建消费者线程
if(pthread_create(&tid2,NULL,task2,NULL)!=0)
{
printf("tid2 create error\n");
return -1;
}
//使主线程运行,便于观察分支线程现象
while(1);
//主线程回收资源
pthread_detach(tid1);
pthread_detach(tid2);
//销毁无名信号量
sem_destroy(&sem);
return 0;
}
4.使用三个线程完成两个文件的拷贝,线程1完成拷贝前一半,线程2完成拷贝后一半,主线程回收两个分支线程的资源
#include <myhead.h>
//定义无名信号量
sem_t sem1;
sem_t sem2;
struct Info
{
const char *src;
const char *dst;
int len;
};
//定义计算len函数
int length(const char *srcfile,const char *dstfile)
{
int srcfd,dstfd;
if((srcfd=open(srcfile,O_RDONLY))==-1)
{
perror("srcfile open error");
return -1;
}
if((dstfd=open(dstfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("dstfile open error");
return -1;
}
int len=lseek(srcfd,0,SEEK_END);
close(srcfd);
close(dstfd);
return len;
}
//定义拷贝函数
int copy(const char *srcfile,const char *dstfile,int start,int len)
{
int srcfd,dstfd;
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);
char buf[128]="";
int set=0;
int sum=0;
while(1)
{
set=read(srcfd,buf,sizeof(buf));
sum+=set;
if(sum>=len||set==0)
{
write(dstfd,buf,set-(sum-len));
break;
}
write(dstfd,buf,set);
}
return 0;
}
//创建分支线程1
void *task1(void *arg)
{
copy(((struct Info*)arg)->src,((struct Info*)arg)->dst,0,(((struct Info*)arg)->len)/2);
sem_post(&sem1);
pthread_exit(NULL);
}
//创建分支线程2
void *task2(void *arg)
{
sem_wait(&sem1);
copy(((struct Info*)arg)->src,((struct Info*)arg)->dst,(((struct Info*)arg)->len)/2,((struct Info*)arg)->len-(((struct Info*)arg)->len)/2);
sem_post(&sem2);
pthread_exit(NULL);
}
/********主程序********/
int main(int argc, const char *argv[])
{
if(argc !=4)
{
printf("input file error\n");
printf("usage:./a.out srcfile dstfile\n");
return -1;
}
//定义两个线程号
pthread_t tid1,tid2;
//初始化无名信号量
sem_init(&sem1,0,0);
sem_init(&sem2,0,0);
int len=length(argv[1],argv[2]);
struct Info fbuf={argv[1],argv[2],len};
//创建生产者线程
if(pthread_create(&tid1,NULL,task1,&fbuf)!=0)
{
printf("tid1 create error\n");
return -1;
}
//创建消费者线程
if(pthread_create(&tid2,NULL,task2,&fbuf)!=0)
{
printf("tid2 create error\n");
return -1;
}
//使主线程运行,便于观察分支线程现象
sem_wait(&sem2);
pthread_detach(tid1);
pthread_detach(tid2);
//销毁无名信号量
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}
5.使用三个线程完成:线程1输出字符' A ',线程2输出字符' B ',线程3输出字符' C ',要求输出结果为: ABCABCABCABCABC ..
#include <myhead.h>
//定义无名信号量
sem_t sem1;
sem_t sem2;
sem_t sem3;
//创建分支线程1
void *task1(void *arg)
{
while(1)
{
sem_wait(&sem3);
sleep(2);
printf("A");
sem_post(&sem1);
}
}
//创建分支线程2
void *task2(void *arg)
{
while(1)
{
sem_wait(&sem1);
printf("B");
sem_post(&sem2);
}
}
/********主程序********/
int main(int argc, const char *argv[])
{
//定义两个线程号
pthread_t tid1,tid2;
//初始化无名信号量
sem_init(&sem1,0,0);
sem_init(&sem2,0,0);
sem_init(&sem3,0,1);
//创建生产者线程
if(pthread_create(&tid1,NULL,task1,NULL)!=0)
{
printf("tid1 create error\n");
return -1;
}
//创建消费者线程
if(pthread_create(&tid2,NULL,task2,NULL)!=0)
{
printf("tid2 create error\n");
return -1;
}
//主进程任务
while(1)
{
sem_wait(&sem2);
printf("C\n");
sem_post(&sem3);
}
//主线程回收资源
pthread_detach(tid1);
pthread_detach(tid2);
//销毁无名信号量
sem_destroy(&sem1);
sem_destroy(&sem2);
sem_destroy(&sem3);
return 0;
}