Mutex

 

Expt No: 5                        Mutual Exclusion

Date:                        (Producer Consumer Problem)

 

 

Aim: To demonstrate mutual exclusion using mutex in Producer Consumer application.

 

Program :

// Producer Consumer Problem

#include <pthread.h>          

#include <stdio.h>

#include <stdlib.h>

#include </usr/include/semaphore.h>

#include <unistd.h>     // for sleep

 

#define BUFSIZE        5      /* total number of slots */

#define NP                 1               /* total number of producers */

#define NC                 1               /* total number of consumers */

#define NITEMS         5      /* number of items produced/consumed */

 

typedef struct

{

    int buf[BUFSIZE];  /* shared var */

    int in;                    /* buf[in%BUFSIZE] – first empty slot */

    int out;                   /* buf[out%BUFSIZE] – first full slot */

    sem_t full;              /* keep track of number of full spots */

    sem_t empty;          /* keep track of number of empty spots */

 

    /* enforce mutual exclusion to shared data */

    pthread_mutex_t mutex;

} sbuf_t;

sbuf_t shared;

 


 

void *Producer(void *arg)

{

    int i, item;

 

    for (i=1; i <=NITEMS; i++)

    {

        item = i;    /* Produce item */

 

        /* Prepare to write item to buf */

        /* If there are no empty slots, wait */

        sem_wait(&shared.empty);

 

        /* If another thread uses the buffer, wait */

        pthread_mutex_lock(&shared.mutex);

        shared.buf[shared.in] = item;

        shared.in = (shared.in+1)%BUFSIZE;

        printf("Produced : %d\n", item);

        fflush(stdout);

 

 

        /* Release the buffer */

        pthread_mutex_unlock(&shared.mutex);

 

        /* Increment the number of full slots */

        sem_post(&shared.full);

       

        /* Interleave  producer and consumer execution */

        sleep(1);

    }

    return NULL;

}

 


 

void *Consumer(void *arg)

{

int i, item;

 

for (i=NITEMS; i > 0; i--)

{

sem_wait(&shared.full);

 

pthread_mutex_lock(&shared.mutex);

item=i;

item=shared.buf[shared.out];

shared.out = (shared.out+1)%BUFSIZE;

 

printf("\tConsumed : %d\n", item);

        fflush(stdout);

 

/* Release the buffer */

pthread_mutex_unlock(&shared.mutex);

 

/* Increment the number of full slots */

sem_post(&shared.empty);

 

/* Interleave  producer and consumer execution */

sleep(1);

}

return NULL;

}

 


 

int main()

{

pthread_t idP, idC;

 

sem_init(&shared.full, 0, 0);

sem_init(&shared.empty, 0, BUFSIZE);

pthread_mutex_init(&shared.mutex, NULL);

 

/* Create a new producer */

pthread_create(&idP, NULL, Producer, (void*)NP);

 

/*create a new Consumer*/

pthread_create(&idC, NULL, Consumer, (void*)NC);

 

pthread_exit(NULL);

}

 

 

Result: Thus the program to demonstrate mutual exclusion using mutex was written and executed.

 

 

No comments:

Post a Comment

Don't be a silent reader...
Leave your comments...

Anu