#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define MAX_READERS 5
int readers;
sem_t can_read;
sem_t can_write;
sem_t rcount;
void *writer(void *data) {
while (1) {
sem_wait(&can_write);
puts("WRITING!");
sem_post(&can_read);
}
}
void *reader(void *data) {
while (1) {
sem_wait(&can_read);
sem_wait(&rcount);
readers++;
if (readers < MAX_READERS) {
sem_post(&can_read);
}
sem_post(&rcount);
printf("READING! (id=%d)\n", (int) data);
sem_wait(&rcount);
readers--;
if (readers == 0) {
sem_post(&can_write);
} else {
sem_post(&can_read);
}
sem_post(&rcount);
}
}
int main(int argc, char **argv) {
int i;
pthread_t thread_reader[MAX_READERS];
pthread_t thread_writer;
readers = 0;
sem_init(&can_write, 0, 1);
sem_init(&can_read, 0, 0);
sem_init(&rcount, 0, 1);
pthread_create(&thread_writer, NULL, writer, NULL);
for (i = 0; i < MAX_READERS; i++) {
pthread_create(&thread_reader[i], NULL, reader, (void*) i);
}
pthread_join(thread_writer, NULL);
for (i = 0; i < MAX_READERS; i++) {
pthread_join(thread_reader[i], NULL);
}
return 0;
}