//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