20 Reader Writer Program in C

Program:

   
#include<stdlib.h>
#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
#define MAX 5

// Writer: Only one writer can write at a time

// Reader: Multiple Reader's can read
//         Ensure no writer present while reading

int rc = 0; // To store number of readers

int cnt = 1; // It is our Critical Section

pthread_mutex_t mutex;
sem_t write;

// Writer Function
void *writer(int *i)
{
    // Binary Semaphore
    sem_wait(&write); // write-- 
    cnt = rand() %10;
    printf("\n\n Writer: %d Item: %d",*(int *)i ,cnt);
    sem_post(&write); // write++
}

void *reader(int *i)
{
    // Readers Count Increment
    pthread_mutex_lock(&mutex);
    rc++;
    if(rc == 1)
        sem_wait(&write); 
    pthread_mutex_unlock(&mutex);

    // Accessing Critical Section
    printf("\n Reader: %d Item: %d",*(int *)i,cnt);

    // Readers Count Decrement
    pthread_mutex_lock(&mutex);
    rc--;
    if(rc == 0)
        sem_post(&write);
    pthread_mutex_unlock(&mutex);
}


int main()
{
    pthread_t wr[10],read[10];
    sem_init(&write,0,1);   
    pthread_mutex_init(&mutex,NULL);

    int a[] = {1,2,3,4,5,6,7,8,9,10};

    for(int i=0;i<10;i++)
    {
        pthread_create(&wr[i],NULL,(void *) &writer,(void *) &a[i]);
        pthread_create(&read[i],NULL,(void *) &reader,(void *) &a[i]);
    }
    
    for(int i=0;i<10;i++)
    {
        pthread_join(wr[i],NULL);
        pthread_join(read[i],NULL);
    }

    sem_destroy(&write);
    pthread_mutex_destroy(&mutex);  

    return 0;
}

Output:

Reader-Writer Problem


Previous
Next Post »