Tuesday, 8 November 2011

READERS WRITERS PROBLEM


//Program to implement readers writers problem
#include<stdio.h>
#include<pthread.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
int nreaders=0,writing=0;

void acquire_read_lock()
{
  pthread_mutex_lock(&mutex);
  while(writing)
  pthread_cond_wait(&cond,&mutex);
  ++nreaders;
  pthread_mutex_unlock(&mutex);
}

void release_read_lock()
{
  pthread_mutex_lock(&mutex);
  --nreaders;
  if(nreaders==0)
  pthread_cond_broadcast(&cond);
  pthread_mutex_unlock(&mutex);
}

void acquire_write_lock()
{
  pthread_mutex_lock(&mutex);
  while(writing||nreaders>0)
  pthread_cond_wait(&cond,&mutex);
  writing=1;
  pthread_mutex_unlock(&mutex);
}

void release_write_lock()
{
  pthread_mutex_lock(&mutex);
  writing=0;
  pthread_cond_broadcast(&cond);
  pthread_mutex_unlock(&mutex);
}

void *reader(void *s)
{
  int i;
  while(1)
  {
   acquire_read_lock();
   for(i=0;i<5;i++)
   {
    printf("Reader id %d, count %d\n",(int)s,i);
    sleep(1);
   }
   release_read_lock();
   sched_yield();
  }
}

void *writer(void *s)
{
  int i;
  while(1)
  {
   acquire_write_lock();
   for(i=0;i<5;i++)
   {
    printf("Writer id %d, count %d\n",(int)s,i);
    sleep(1);
   }
   release_write_lock();
   sched_yield();
  }
}

main()
{
  pthread_t t[6];
  pthread_attr_t attr;
  int j;

  pthread_mutex_init(&mutex,0);
  pthread_cond_init(&cond,0);

  for(j=0;j<3;j++)
  pthread_create(&t[j],0,reader,(void*)j);
  for(;j<6;j++)
  pthread_create(&t[j],0,writer,(void*)j);
  while(1);
}

OUTPUT
gcc readerwriter.c -lpthread
./aout

Reader id 0, count 0
Reader id 1, count 0
Reader id 2, count 0
Reader id 0, count 1
Reader id 1, count 1
Reader id 2, count 1
Reader id 0, count 2
Reader id 1, count 2
Reader id 2, count 2
Reader id 0, count 3
Reader id 1, count 3
Reader id 2, count 3
Reader id 0, count 4
Reader id 1, count 4
Reader id 2, count 4
Writer id 4, count 0
Writer id 4, count 1
Writer id 4, count 2
Writer id 4, count 3
Writer id 4, count 4
Writer id 5, count 0
Writer id 5, count 1
Writer id 5, count 2
Writer id 5, count 3

No comments:

Post a Comment