In C++ code Project Use given Functions!!! 7 processes are characterized by 4 re
ID: 3852607 • Letter: I
Question
In C++ code
Project
Use given Functions!!!
7 processes are characterized by 4 readers and 3 writers.
Up to three reader processes can be inside their critical section without any writer process. For writer process to go into its critical section, it should check whether there is any reader or writer process is in the critical section.
Critical section in this problem is reading shared data buffer for reader and updating shared data buffer for writer processes. It is up to you to implement any shared data for readers and writers but you have to specify clearly following things in your sample output.
• When reader or writer enters its critical section, it has to report whether there are any reader(s) or writer(s) other than itself.
• You may print out the data you read or write when you implement real buffer. (Optional)
• You have to print out “Panic Messages” when the rules behind this semi critical section problem are not observed.
In your main program, you run the random number generator function to choose process to execute. The chosen process starts (resumes) execution and after one instruction, it will be returned. (You should force each process run exactly one instruction then returns and waiting for its turn.)
You can implement this using switch statement in C or C++. Do not use any multi-threading nor mutex feature from programming language. Each process is one big switch statement and will be returned after each instruction. You need to keep track of program counter of each process to resume at the right place once it will be chosen to run by keeping global counter variable per process.
***Subproject 1: You should implement binary and counting semaphores as studied in the class for this project.
void P(int & x, bool & key){
If (lock==true)
;
Else{
If(key == true){
swap(lock,key);
x=2;
}
}
}
void V(int & x, bool & key){
X=1;
swap(lock,key);
}
***Subproject 2: You should implement swap operation as studied in the class for this project.
void Swap (boolean *a, boolean *b) {
boolean temp = *a;
*a = *b;
*b = temp:
}
Explanation / Answer
Code:
//Include libraries
#include<iostream>
#include<pthread.h>
#include<semaphore.h>
#include <string.h>
//Use std namespace
using namespace std;
//Define semaphore
sem_t lReadAccss;
//Define semaphore
sem_t lWrteAccss;
//Declare variable
int lReadCnt=0;
//Declare array
char lBffr[50];
//Define a method for reader
void * Reader(void *arg)
{
//Call method
sem_wait(&lReadAccss);
//Increment
lReadCnt++;
//If count is 1
if(lReadCnt==1)
//Call method
sem_wait(&lWrteAccss);
//Call method
sem_post(&lReadAccss);
//Display message
cout<<"Inside reader Buffer value is "<<lBffr;
//End of line
cout<<endl;
//Call method
sem_wait(&lReadAccss);
//Decrement value
lReadCnt--;
//If count is 0
if(lReadCnt==0)
//Call method
sem_post(&lWrteAccss);
//Call method
sem_post(&lReadAccss);
}
//Define a method for writer
void * Writer(void *arg)
{
//Declare variable
int lWrterNum=*(int*)arg;
//Call method
sem_wait(&lWrteAccss);
//End of line
cout<<endl;
//Display message
cout<<"writer number"<<lWrterNum<<endl;
//Display message
cout<<"Before Inside writer Buffer value is "<<lBffr<<endl;
//Display message
strcpy(lBffr,"test data written to Buffer");
//Display message
cout<<"After Inside writer Buffer value is "<<lBffr<<endl;
//Call method
sem_post(&lWrteAccss);
}
//Define main method
int main()
{
//Declare array
pthread_t lReaders[4];
//Declare array
pthread_t lWrtrs[3];
//Display message
strcpy(lBffr,"Not used so far");
//Call method
sem_init(&lReadAccss,0,1);
//Call method
sem_init(&lWrteAccss,0,1);
//Loop until length
for(int li=0; li<4;li++)
{
//Call method
pthread_create(&lReaders[li],NULL,Reader,(void *)&li);
}
//Loop until length
for(int li=0; li<3;li++)
{
//Call method
pthread_create(&lWrtrs[li],NULL,Writer,(void*)&li);
}
//Loop until length
for(int li=0; li<4;li++)
{
//Call method
pthread_join(lReaders[li],0);
}
//Loop until length
for(int li=0; li<3;li++)
{
//Call method
pthread_join(lWrtrs[li],0);
}
//Call method
sem_destroy (&lReadAccss);
//Call method
sem_destroy (&lWrteAccss);
//Return 0
return 0;
}