#include #include #include #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; }