#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
#include <string.h>
//定义个全局变量数组,临界资源
char buf[100]="";
//信号量,临界资源
sem_t sem1,sem2;
void* call1(void* arg)
{
//打开文件1
FILE* fp=fopen("./11copy.c","r");
//判断是否为空,是的话就退出程序
if(NULL==fp)
{
perror("fopen");
return NULL;
}
while(1)
{
//P操作
if(sem_wait(&sem1)<0)
{
perror("sem_wait");
break;
}
//第一个为数组名,第二个为计算字符串或内存的大小
//然后置0
bzero(buf,sizeof(buf));
//通过访问文件来计算文件内有多少字符串
//如果等于零就退出程序
if(fgets(buf,sizeof(buf),fp)==0)
{
break;
}
//V操作
if(sem_post(&sem2)<0)
{
perror("sem_post");
break;
}
}
if(sem_post(&sem2)<0)
{
perror("sem_post");
}
printf("文件读取完毕\n");
fclose(fp);
pthread_exit(NULL);
}
void* call2(void* arg)
{
while(1)
{
//P操作
if(sem_wait(&sem2)<0)
{
perror("sem_wait");
pthread_exit(NULL);
}
//计算字符串长度是否为0
if(strlen(buf)==0)
{
break;
}
printf("%s",buf);
fflush(stdout);
//V操作
if(sem_post(&sem1)<0)
{
perror("sem_post");
break;
}
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//申请并初始化信号灯,初始化为1
if(sem_init(&sem1,0,1)<0)
//判断是否小于0,小于则不进行下面程序直接退出程序
{
perror("sem_init");
return -1;
}
printf("信号量创建成功\n");
//申请并初始化信号灯,初始化为0
if(sem_init(&sem2,0,0)<0)
//判断是否小于0,小于则不进行下面程序直接退出程序
{
perror("sem_init");
return -1;
}
printf("信号量创建成功\n");
//创建一个线程
pthread_t tid_r,tid_w;
//一个线程读取
if(pthread_create(&tid_r,NULL,call1,NULL)!=0)
{
perror("pthread_create1\n");
return -1;
}
printf("线程创建成功\n");
//一个线程打印
if(pthread_create(&tid_w,NULL,call2,NULL)!=0)
{
perror("pthread_create1\n");
return -1;
}
printf("线程创建成功\n");
//阻塞等待指定分支线程退出;
//并且回收线程的资源;
//同时会接收该线程的退出状态值;
pthread_join(tid_r,NULL);
pthread_join(tid_w,NULL);
//销毁线程
sem_destroy(&sem1);
sem_destroy(&sem2);
//退出程序
return 0;
}