Implement Readers Writer Problem using Semaphores.
Theory:
http://en.wikipedia.org/wiki/Readers%E2%80%93writers_problem
Solution to First Reader Writer Problem --Readers preference
----------------------------------------------------------------
//no reader shall be kept waiting if the share is currently opened for reading
#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
sem_t mutex,writeblock;
int data = 0,rcount = 0;
void *reader(void *arg)
{
int f;
f = ((int)arg);
sem_wait(&mutex);
rcount = rcount + 1;
if(rcount==1)
sem_wait(&writeblock);
sem_post(&mutex);
printf("Data read by the reader%d is %d\n",f,data);
sleep(1);
sem_wait(&mutex);
rcount = rcount - 1;
if(rcount==0)
sem_post(&writeblock);
sem_post(&mutex);
}
void *writer(void *arg)
{
int f;
f = ((int) arg);
sem_wait(&writeblock);
data++;
printf("Data writen by the writer%d is %d\n",f,data);
sleep(1);
sem_post(&writeblock);
}
main()
{
int i,b;
pthread_t rtid[5],wtid[5];
sem_init(&mutex,0,1);
sem_init(&writeblock,0,1);
for(i=0;i<=2;i++)
{
pthread_create(&wtid[i],NULL,writer,(void *)i);
pthread_create(&rtid[i],NULL,reader,(void *)i);
}
for(i=0;i<=2;i++)
{
pthread_join(wtid[i],NULL);
pthread_join(rtid[i],NULL);
}
}
Solution to 2nd Reader Writer Problem [ Writer's preference ]
----------------------------------------------------------------------------------------
//no writer, once added to the queue, shall be kept waiting longer than absolutely necessary
Theory:
http://en.wikipedia.org/wiki/Readers%E2%80%93writers_problem
Solution to First Reader Writer Problem --Readers preference
----------------------------------------------------------------
//no reader shall be kept waiting if the share is currently opened for reading
#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
sem_t mutex,writeblock;
int data = 0,rcount = 0;
void *reader(void *arg)
{
int f;
f = ((int)arg);
sem_wait(&mutex);
rcount = rcount + 1;
if(rcount==1)
sem_wait(&writeblock);
sem_post(&mutex);
printf("Data read by the reader%d is %d\n",f,data);
sleep(1);
sem_wait(&mutex);
rcount = rcount - 1;
if(rcount==0)
sem_post(&writeblock);
sem_post(&mutex);
}
void *writer(void *arg)
{
int f;
f = ((int) arg);
sem_wait(&writeblock);
data++;
printf("Data writen by the writer%d is %d\n",f,data);
sleep(1);
sem_post(&writeblock);
}
main()
{
int i,b;
pthread_t rtid[5],wtid[5];
sem_init(&mutex,0,1);
sem_init(&writeblock,0,1);
for(i=0;i<=2;i++)
{
pthread_create(&wtid[i],NULL,writer,(void *)i);
pthread_create(&rtid[i],NULL,reader,(void *)i);
}
for(i=0;i<=2;i++)
{
pthread_join(wtid[i],NULL);
pthread_join(rtid[i],NULL);
}
}
Solution to 2nd Reader Writer Problem [ Writer's preference ]
----------------------------------------------------------------------------------------
//no writer, once added to the queue, shall be kept waiting longer than absolutely necessary
#include <pthread.h>
#include <sched.h>
#include <semaphore.h>
#include <stdio.h>
#include <unistd.h>
#define MAXTHREAD 10 /* define # readers */
void
access_database();
/* prototypes */
void
non_access_database();
void
* reader(
void
*);
void
* writer(
void
*);
sem_t q;
/* establish que */
int
rc = 0;
/* number of processes reading or wanting to */
int
wc = 0;
int
write_request = 0;
int
main()
{
pthread_t readers[MAXTHREAD],writerTh;
int
index;
int
ids[MAXTHREAD];
/* readers and initialize mutex, q and db-set them to 1 */
sem_init (&q,0,1);
for
(index = 0; index < MAXTHREAD; index ++)
{
ids[index]=index+1;
/* create readers and error check */
if
(pthread_create(&readers[index],0,reader,&ids[index])!=0){
perror
(
"Cannot create reader!"
);
exit
(1);
}
}
if
(pthread_create(&writerTh,0,writer,0)!=0){
perror
(
"Cannot create writer"
);
/* create writers and error check */
exit
(1);
}
pthread_join(writerTh,0);
sem_destroy (&q);
return
0;
}
void
* reader(
void
*arg)
/* readers function to read */
{
int
index = *(
int
*)arg;
int
can_read;
while
(1){
can_read = 1;
sem_wait(&q);
if
(wc == 0 && write_request == 0) rc++;
else
can_read = 0;
sem_post(&q);
if
(can_read) {
access_database();
printf
(
"Thread %d reading\n"
, index);
sleep(index);
sem_wait(&q);
rc--;
sem_post(&q);
}
sched_yield();
}
return
0;
}
;
void
* writer(
void
*arg)
/* writer's function to write */
{
int
can_write;
while
(1){
can_write = 1;
non_access_database();
sem_wait (&q);
if
(rc == 0) wc++;
else
{ can_write = 0; write_request = 1; }
sem_post(&q);
if
(can_write) {
access_database();
printf
(
"Writer is now writing...Number of readers: %d\n"
,rc);
sleep(3);
sem_wait(&q);
wc--;
write_request = 0;
sem_post(&q);
}
sched_yield();
}
return
0;
}
void
access_database()
{
}
void
non_access_database()
{
}
No comments:
Post a Comment