Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

#include <stdio.

h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

#define NUM_READERS 5
#define NUM_WRITERS 5

sem_t mutex, write_mutex;


int read_count = 0;
int shared_resource = 0;

void *reader(void *arg) {


int reader_id = *((int *)arg);

while (1) {
// Reader entry section
sem_wait(&mutex);
read_count++;
if (read_count == 1) {
sem_wait(&write_mutex); // If the first reader, lock the write mutex
}
sem_post(&mutex);

// Reader critical section


printf("Reader %d is reading shared resource: %d\n", reader_id, shared_resource);
usleep(500000); // Simulate some reading time

// Reader exit section


sem_wait(&mutex);
read_count--;
if (read_count == 0) {
sem_post(&write_mutex); // If the last reader, release the write mutex
}
sem_post(&mutex);

// Reader non-critical section


usleep(500000); // Simulate some processing time
}

pthread_exit(NULL);
}
void *writer(void *arg) {
int writer_id = *((int *)arg);

while (1) {
// Writer entry section
sem_wait(&write_mutex);
// Writer critical section
shared_resource++;
printf("Writer %d is writing shared resource: %d\n", writer_id, shared_resource);
usleep(500000); // Simulate some writing time

// Writer exit section


sem_post(&write_mutex);

// Writer non-critical section


usleep(500000); // Simulate some processing time
}

pthread_exit(NULL);
}

int main() {
pthread_t readers[NUM_READERS], writers[NUM_WRITERS];
int reader_ids[NUM_READERS], writer_ids[NUM_WRITERS];

sem_init(&mutex, 0, 1);
sem_init(&write_mutex, 0, 1);

for (int i = 0; i < NUM_READERS; i++) {


reader_ids[i] = i + 1;
pthread_create(&readers[i], NULL, reader, &reader_ids[i]);
}

for (int i = 0; i < NUM_WRITERS; i++) {


writer_ids[i] = i + 1;
pthread_create(&writers[i], NULL, writer, &writer_ids[i]);
}

// Let the threads run for a while


sleep(5);

for (int i = 0; i < NUM_READERS; i++) {


pthread_cancel(readers[i]);
}

for (int i = 0; i < NUM_WRITERS; i++) {


pthread_cancel(writers[i]);
}

for (int i = 0; i < NUM_READERS; i++) {


pthread_join(readers[i], NULL);
}
for (int i = 0; i < NUM_WRITERS; i++) {
pthread_join(writers[i], NULL);
}

sem_destroy(&mutex);
sem_destroy(&write_mutex);

return 0;
}

OUTPUT:

You might also like