#include #include #include /* This program provides a possible solution for the first readers-writers problem using a mutex and a semaphore. 10 readers and 5 writers are used to demonstrate the solution. Feel free to change these values. */ sem_t wrt; pthread_mutex_t mutex; int cnt = 1; int numreader = 0; void *writer(void *wno) { sem_wait(&wrt); cnt = cnt * 2; printf("Writer %d modified cnt to %d\n", *((int *)wno), cnt); sem_post(&wrt); return NULL; } void *reader(void *rno) { // Reader acquires the lock before modifying numreader pthread_mutex_lock(&mutex); numreader++; if (numreader == 1) { sem_wait(&wrt); // If this is the first reader, it blocks the writer } pthread_mutex_unlock(&mutex); // Reading section printf("Reader %d: read cnt as %d\n", *((int *)rno), cnt); // Reader acquires the lock before modifying numreader pthread_mutex_lock(&mutex); numreader--; if (numreader == 0) { sem_post(&wrt); // If this is the last reader, it wakes up the writer } pthread_mutex_unlock(&mutex); return NULL; } int main() { pthread_t read_t[10], write_t[5]; pthread_mutex_init(&mutex, NULL); sem_init(&wrt, 0, 1); int a[10] = {1,2,3,4,5,6,7,8,9,10}; // Just used for numbering readers/writers for (int i = 0; i < 10; i++) { pthread_create(&read_t[i], NULL, reader, (void *)&a[i]); } for (int i = 0; i < 5; i++) { pthread_create(&write_t[i], NULL, writer, (void *)&a[i]); } for (int i = 0; i < 10; i++) { pthread_join(read_t[i], NULL); } for (int i = 0; i < 5; i++) { pthread_join(write_t[i], NULL); } pthread_mutex_destroy(&mutex); sem_destroy(&wrt); return 0; }