#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <stdio.h>
#include<fcntl.h>
#include <pthread.h>
#include <errno.h>
//文件锁,buffer锁,empty和full信号量
sem_t file_mutex,buf_mutex,empty,full;
int offset = 0;
char buffer[256];
void producer(int i){
int k = 0;
while(k<8){
sem_wait(&empty);
sem_wait(&buf_mutex);
sem_wait(&file_mutex);
//从源文件读取
int fd = open("./source.txt",O_RDWR);
lseek(fd,offset,SEEK_SET);
read(fd,buffer,1);
printf("Producer %d is working!\n",i);
k++;
offset++;
sem_post(&file_mutex);
sem_post(&buf_mutex);
sem_post(&full);
usleep(10);
}
}
void consumer(int i){
int k = 0;
while(k<5){
sem_wait(&full);
sem_wait(&buf_mutex);
//从buffer中取数据,打印
printf("Consumer %d printfs %s\n",i,buffer);
k++;
sem_post(&buf_mutex);
sem_post(&empty);
usleep(10);
}
}
int main(){
sem_init(&file_mutex, 0, 1);
sem_init(&buf_mutex, 0, 1);
sem_init(&full, 0, 0);
sem_init(&empty, 0, 5);
pthread_t pro1,pro2,pro3,con1,con2,con3,con4;
//3个生产者,4个消费者。
pthread_create(&pro1,NULL,(void*)producer,1);
pthread_create(&pro2,NULL,(void*)producer,2);
pthread_create(&pro3,NULL,(void*)producer,3);
pthread_create(&con1,NULL,(void*)consumer,1);
pthread_create(&con2,NULL,(void*)consumer,2);
pthread_create(&con3,NULL,(void*)consumer,3);
pthread_create(&con4,NULL,(void*)consumer,4);
pthread_join(pro1,NULL);
pthread_join(pro2,NULL);
pthread_join(pro3,NULL);
pthread_join(con1,NULL);
pthread_join(con2,NULL);
pthread_join(con3,NULL);
pthread_join(con4,NULL);
}