1.将一个文件中的数据打印到终端上,类似cat一个文件,要求如下
a.A线程读取文件中的数据
b.B线程将A线程读取到的数据打印到终端上
c.文件打印完毕后,结束进程
#include <stdio.h>
#include<string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <semaphore.h>
//临界资源
sem_t sem1,sem2;
char c=0;
int fd_r;
void* callback1(void* arg)
{
int fd_r=*(int *)arg;
ssize_t res;
while (1)
{
// printf("1\n");
/*********临界区************/
sem_wait(&sem1);//P操作
res=read(fd_r,&c,1);
sem_post(&sem2);//V操作
if(res==0)
{
//pthread_exit(NULL);
break;
}
/*********临界区************/
}
pthread_exit(NULL);
}
void*callback2(void*arg)
{
char temp=0;
while(1)
{
// printf("2\n");
/*********临界区************/
sem_wait(&sem2);//P操作
printf("%c",c);
sem_post(&sem1); //V操作
/*********临界区************/
}
pthread_exit(NULL);
}
int main(int argc, char const *argv[])
{
//打开文件
int fd_r=open("./01.c",O_RDONLY);
//创建2个信号量
if(sem_init(&sem1,0,1)<0)
{
perror("sem_init");
return -1;
}
if(sem_init(&sem2,0,0)<0)
{
perror("sem_init");
return -1;
}
//创建2个线程
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,callback1,&fd_r)!=0)
{
fprintf(stderr,"pthread_create failed\n");
return -1;
}
pthread_detach(tid1);
if(pthread_create(&tid2,NULL,callback2,NULL)!=0)
{
fprintf(stderr,"pthread_create failed\n");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
//销毁信号量
sem_destroy(&sem1);
sem_destroy(&sem2);
//关闭文件
close(fd_r);
return 0;
}

2.用条件变量实现,有编号为ABC的3个线程,线程内分别打印自己的线程编号,要求打印顺序为ABC
a.提示:多个条件变量
#include <stdio.h>
#include<string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <semaphore.h>
//创建初始化条件变量
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
pthread_cond_t cond1=PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2=PTHREAD_COND_INITIALIZER;
//创建锁
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
int flag=0;
void* callback1(void* arg)
{
while (1)
{
pthread_mutex_lock(&mutex);
if(flag!=0)
{
pthread_cond_wait(&cond,&mutex);
}
printf("%c",'A');
flag=1;
pthread_cond_signal(&cond1);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void*callback2(void*arg)
{
while (1)
{
pthread_mutex_lock(&mutex);
if(flag!=1)
{
pthread_cond_wait(&cond1,&mutex);
}
printf("%c",'B');
flag =2;
pthread_cond_signal(&cond2);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void*callback3(void*arg)
{
while (1)
{
pthread_mutex_lock(&mutex);
if(flag!=2)
{
pthread_cond_wait(&cond2,&mutex);
}
printf("%c\n",'C');
sleep(1);
flag=0;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main(int argc, char const *argv[])
{
//创建3个线程
pthread_t tid1,tid2,tid3;
if(pthread_create(&tid1,NULL,callback1,NULL)!=0)
{
fprintf(stderr,"pthread_create failed\n");
return -1;
}
pthread_detach(tid1);
if(pthread_create(&tid2,NULL,callback2,NULL)!=0)
{
fprintf(stderr,"pthread_create failed\n");
return -1;
}
if(pthread_create(&tid3,NULL,callback3,NULL)!=0)
{
fprintf(stderr,"pthread_create failed\n");
return -1;
}
pthread_cond_init(&cond,NULL);
pthread_mutex_init(&mutex,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_join(tid3,NULL);
return 0;
}
673

被折叠的 条评论
为什么被折叠?



