The following code is an implementation of the producer cons

The following code is an implementation of the producer consumer problem using a software locking mechanism. Your tasks here require you to debug the code with the intent of achieving the following tasks:

Task 1: Identifying the critical section

Task 2: Identify the software locks and replace them with a simplified mutex lock and unlock.

HINT: The code provided relies heavily on the in and out pointers of the buffer. You should make the code run on a single count variable.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define MAXSIZE 100
#define ITERATIONS 1000
int buffer[MAXSIZE]; // buffer
int nextp, nextc; // temporary storage
int count=0;

void printfunction(void * ptr)
{
int count = *(int *) ptr;
if (count==0)
{
printf(\"All items produced are consumed by the consumer \ \");
}
else
{
for (int i=0; i<=count; i=i+1)
{
printf(\"%d, \\t\",buffer[i]);
}
printf(\"\ \");
}
}
void *producer(void *ptr)
{
int item, flag=0;
int in = *(int *) ptr;
do
{
item = (rand()%7)%10;
flag=flag+1;
nextp=item;
buffer[in]=nextp;
in=((in+1)%MAXSIZE);
while(count <= MAXSIZE)
{
count=count+1;
printf(\"Count = %d - incremented at producer\ \", count);
}
} while (flag<=ITERATIONS);
pthread_exit(NULL);

}
void *consumer(void *ptr)
{
int item, flag=ITERATIONS;
int out = *(int *) ptr;
do
{
while (count >0)
{
nextc = buffer[out];
out=(out+1)%MAXSIZE;

printf(\"\\tCount = %d - decremented at consumer\ \", count, flag);
count = count-1;
flag=flag-1;
}
if (count <= 0)
{
printf(\"consumer made to wait...faster than producer.\ \");
}
}while (flag>=0);
pthread_exit(NULL);
}

int main(void)
{
int in=0, out=0; //pointers
pthread_t pro, con;
// Spawn threads
pthread_create(&pro, NULL, producer, &count);
pthread_create(&con, NULL, consumer, &count);

if (rc1)
{
printf(\"ERROR; return code from pthread_create() is %d\ \", rc1);
exit(-1);
}
if (rc2)
{
printf(\"ERROR; return code from pthread_create() is %d\ \", rc2);
exit(-1);
}
// Wait for the threads to finish
// Otherwise main might run to the end
// and kill the entire process when it exits.
pthread_join(pro, NULL);
pthread_join(con, NULL);
printfunction(&count);
}

Solution

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#define MAXSIZE 100
#define ITERATIONS 1000
int buffer[MAXSIZE]; // buffer
int nextp, nextc; // temporary storage
int count=0;

void printfunction(void * ptr)
{
int count = *(int *) ptr;
if (count==0)
{
printf(\"All items produced are consumed by the consumer \ \");
}
else
{
for (int i=0; i<=count; i=i+1)
{
printf(\"%d, \\t\",buffer[i]);
}
printf(\"\ \");
}
}
void *producer(void *ptr)
{
int item, flag=0;
int in = *(int *) ptr;
do
{
item = (rand()%7)%10;
flag=flag+1;
nextp=item;
buffer[in]=nextp;
in=((in+1)%MAXSIZE);
while(count <= MAXSIZE)
{
count=count+1;
printf(\"Count = %d - incremented at producer\ \", count);
}
} while (flag<=ITERATIONS);
pthread_exit(NULL);

}
void *consumer(void *ptr)
{
int item, flag=ITERATIONS;
int out = *(int *) ptr;
do
{
while (count >0)
{
nextc = buffer[out];
out=(out+1)%MAXSIZE;

printf(\"\\tCount = %d - decremented at consumer\ \", count, flag);
count = count-1;
flag=flag-1;
}
if (count <= 0)
{
printf(\"consumer made to wait...faster than producer.\ \");
}
}while (flag>=0);
pthread_exit(NULL);
}

int main(void)
{
int in=0, out=0; //pointers
pthread_t pro, con;
// Spawn threads
pthread_create(&pro, NULL, producer, &count);
pthread_create(&con, NULL, consumer, &count);

if (rc1)
{
printf(\"ERROR; return code from pthread_create() is %d\ \", rc1);
exit(-1);
}
if (rc2)
{
printf(\"ERROR; return code from pthread_create() is %d\ \", rc2);
exit(-1);
}
// Wait for the threads to finish
// Otherwise main might run to the end
// and kill the entire process when it exits.
pthread_join(pro, NULL);
pthread_join(con, NULL);
printfunction(&count);
}

The following code is an implementation of the producer consumer problem using a software locking mechanism. Your tasks here require you to debug the code with
The following code is an implementation of the producer consumer problem using a software locking mechanism. Your tasks here require you to debug the code with
The following code is an implementation of the producer consumer problem using a software locking mechanism. Your tasks here require you to debug the code with
The following code is an implementation of the producer consumer problem using a software locking mechanism. Your tasks here require you to debug the code with

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site