#include <pthread.h>
//#include<semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
pthread_mutex_t x,wsem;
int readcount;
int data;
void intialize()
{
pthread_mutex_init(&x,NULL);
pthread_mutex_init(&wsem,NULL);
readcount=0;
data=0;
}
void * reader (void * param)
{
int waittime;
//printf("\nReader id= %lu is trying to enter",pthread_self());
pthread_mutex_lock(&x);
readcount++;
if(readcount==1){
pthread_mutex_lock(&wsem);}
printf("\nReader id= %lu has entered",pthread_self
()); printf("\n%d Reader is inside ",readcount
); pthread_mutex_unlock(&x);
waittime
= ((rand()%5+1))*1000; printf("\n Reader sleep: %d s ",(waittime
/1000)); printf("\n Reader data: %d ",data
); Sleep(waittime);
printf("\nReader id= %lu is Leaving",pthread_self
()); pthread_mutex_lock(&x);
readcount--;
if(readcount==0){
//printf("\nReader id= %lu is Leaving",pthread_self());
pthread_mutex_unlock(&wsem);
//printf("\nReader id= %lu is Leaving",pthread_self());
}
//printf("\nReader id= %lu is Leaving",pthread_self());
pthread_mutex_unlock(&x);
//printf("\nReader id= %lu is Leaving",pthread_self());
pthread_exit(NULL);
}
void * writer (void * param)
{
int waittime;
//printf("\nWriter id= %lu is trying to enter",pthread_self());
pthread_mutex_lock(&wsem);
printf("\nWrite id= %lu has entered",pthread_self
()); waittime
=((rand()%3)+1)*1000; printf("\n Writer sleep: %d s ",(waittime
/1000)); printf("\n Writer update data: %d ",data
); Sleep(waittime);
printf("\nWriter id= %lu is leaving",pthread_self
()); pthread_mutex_unlock(&wsem);
//printf("\nWriter id= %lu is leaving",pthread_self());
//Sleep(30);
pthread_exit(NULL);
//exit(0);
}
int main()
{
int n1,n2,i;
printf("\nEnter the no of writers: "); printf("\nEnter the no of readers: "); intialize();
pthread_t writerThreads[n1],readThreads[n2];
for(i=0;i<n1;i++){
pthread_create(&writerThreads[i],NULL,writer,NULL);}
for(i=0;i<n2;i++){
pthread_create(&readThreads[i],NULL,reader,NULL);}
for(i=0;i<n1;i++){
pthread_join(writerThreads[i],NULL);}
for(i=0;i<n2;i++){
pthread_join(readThreads[i],NULL);}
//Sleep(30);
}
I2luY2x1ZGUgPHB0aHJlYWQuaD4KLy8jaW5jbHVkZTxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHdpbmRvd3MuaD4KCnB0aHJlYWRfbXV0ZXhfdCB4LHdzZW07CmludCByZWFkY291bnQ7CmludCBkYXRhOwoKdm9pZCBpbnRpYWxpemUoKQp7CiAgICBwdGhyZWFkX211dGV4X2luaXQoJngsTlVMTCk7CiAgICBwdGhyZWFkX211dGV4X2luaXQoJndzZW0sTlVMTCk7CiAgICByZWFkY291bnQ9MDsKICAgIGRhdGE9MDsKfQoKdm9pZCAqIHJlYWRlciAodm9pZCAqIHBhcmFtKQp7CiAgICBpbnQgd2FpdHRpbWU7CgogICAgLy9wcmludGYoIlxuUmVhZGVyIGlkPSAlbHUgaXMgdHJ5aW5nIHRvIGVudGVyIixwdGhyZWFkX3NlbGYoKSk7CiAgICBwdGhyZWFkX211dGV4X2xvY2soJngpOwogICAgcmVhZGNvdW50Kys7CiAgICBpZihyZWFkY291bnQ9PTEpewogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmd3NlbSk7fQogICAgcHJpbnRmKCJcblJlYWRlciBpZD0gJWx1IGhhcyBlbnRlcmVkIixwdGhyZWFkX3NlbGYoKSk7CiAgICBwcmludGYoIlxuJWQgUmVhZGVyIGlzIGluc2lkZSAiLHJlYWRjb3VudCk7CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmeCk7CiAgICB3YWl0dGltZSA9ICgocmFuZCgpJTUrMSkpKjEwMDA7CiAgICBwcmludGYoIlxuIFJlYWRlciBzbGVlcDogJWQgcyAiLCh3YWl0dGltZS8xMDAwKSk7CiAgICBwcmludGYoIlxuIFJlYWRlciBkYXRhOiAlZCAiLGRhdGEpOwogICAgU2xlZXAod2FpdHRpbWUpOwogICAgcHJpbnRmKCJcblJlYWRlciBpZD0gJWx1IGlzIExlYXZpbmciLHB0aHJlYWRfc2VsZigpKTsKICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmeCk7CiAgICByZWFkY291bnQtLTsKICAgIGlmKHJlYWRjb3VudD09MCl7CiAgICAgICAgLy9wcmludGYoIlxuUmVhZGVyIGlkPSAlbHUgaXMgTGVhdmluZyIscHRocmVhZF9zZWxmKCkpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3c2VtKTsKICAgICAgICAvL3ByaW50ZigiXG5SZWFkZXIgaWQ9ICVsdSBpcyBMZWF2aW5nIixwdGhyZWFkX3NlbGYoKSk7CiAgICB9CiAgICAvL3ByaW50ZigiXG5SZWFkZXIgaWQ9ICVsdSBpcyBMZWF2aW5nIixwdGhyZWFkX3NlbGYoKSk7CiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmeCk7CiAgICAvL3ByaW50ZigiXG5SZWFkZXIgaWQ9ICVsdSBpcyBMZWF2aW5nIixwdGhyZWFkX3NlbGYoKSk7CiAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Cn0KCnZvaWQgKiB3cml0ZXIgKHZvaWQgKiBwYXJhbSkKewogICAgaW50IHdhaXR0aW1lOwoKICAgIC8vcHJpbnRmKCJcbldyaXRlciBpZD0gJWx1IGlzIHRyeWluZyB0byBlbnRlciIscHRocmVhZF9zZWxmKCkpOwogICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3c2VtKTsKICAgIHByaW50ZigiXG5Xcml0ZSBpZD0gJWx1IGhhcyBlbnRlcmVkIixwdGhyZWFkX3NlbGYoKSk7CiAgICB3YWl0dGltZT0oKHJhbmQoKSUzKSsxKSoxMDAwOwogICAgcHJpbnRmKCJcbiBXcml0ZXIgc2xlZXA6ICVkIHMgIiwod2FpdHRpbWUvMTAwMCkpOwogICAgZGF0YSA9IHJhbmQoKSU1MDsKICAgIHByaW50ZigiXG4gV3JpdGVyIHVwZGF0ZSBkYXRhOiAlZCAiLGRhdGEpOwogICAgU2xlZXAod2FpdHRpbWUpOwogICAgcHJpbnRmKCJcbldyaXRlciBpZD0gJWx1IGlzIGxlYXZpbmciLHB0aHJlYWRfc2VsZigpKTsKICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3c2VtKTsKICAgIC8vcHJpbnRmKCJcbldyaXRlciBpZD0gJWx1IGlzIGxlYXZpbmciLHB0aHJlYWRfc2VsZigpKTsKICAgIC8vU2xlZXAoMzApOwogICAgcHRocmVhZF9leGl0KE5VTEwpOwogICAgLy9leGl0KDApOwp9CgppbnQgbWFpbigpCnsKICAgIGludCBuMSxuMixpOwogICAgcHJpbnRmKCJcbkVudGVyIHRoZSBubyBvZiB3cml0ZXJzOiAiKTsKICAgIHNjYW5mKCIlZCIsJm4xKTsKICAgIHByaW50ZigiXG5FbnRlciB0aGUgbm8gb2YgcmVhZGVyczogIik7CiAgICBzY2FuZigiJWQiLCZuMik7CiAgICBpbnRpYWxpemUoKTsKICAgIHB0aHJlYWRfdCB3cml0ZXJUaHJlYWRzW24xXSxyZWFkVGhyZWFkc1tuMl07CiAgICBmb3IoaT0wO2k8bjE7aSsrKXsKICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmd3JpdGVyVGhyZWFkc1tpXSxOVUxMLHdyaXRlcixOVUxMKTt9CiAgICBmb3IoaT0wO2k8bjI7aSsrKXsKICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcmVhZFRocmVhZHNbaV0sTlVMTCxyZWFkZXIsTlVMTCk7fQogICAgZm9yKGk9MDtpPG4xO2krKyl7CiAgICAgICAgcHRocmVhZF9qb2luKHdyaXRlclRocmVhZHNbaV0sTlVMTCk7fQogICAgZm9yKGk9MDtpPG4yO2krKyl7CiAgICAgICAgcHRocmVhZF9qb2luKHJlYWRUaHJlYWRzW2ldLE5VTEwpO30KICAgIC8vU2xlZXAoMzApOwogICAgZXhpdCgwKTsKfQ==