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);
 }




