Hey, so I have a school assignment to create a program that uses a producer thread to create a series of random numbers, and a consumer thread to read those numbers (via a shared bounded buffer), and record the min, max, average, and number of items. Now, the threads aren't synching well. Here's my code:
Code:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
pthread_cond_t empty;
pthread_cond_t full;
int done = 0;
pthread_mutex_t lock;
int in = 0;
int out = 0;
int BUFFER_SIZE = 5;
int buffer[5];
void *consumer();
void *producer();
int main() {
pthread_t tidC;
pthread_t tidP;
pthread_cond_init(&empty, NULL);
pthread_cond_init(&full, NULL);
pthread_create(&tidP, NULL, &producer, NULL);
pthread_create(&tidC, NULL, &consumer, NULL);
pthread_join(tidC, NULL);
pthread_join(tidP, NULL);
return 0;
}
void * producer() {
int seed = 6;
int reps = 7;
int num = 0;
int i = 0;
srand(seed);
printf("Producer in for\n");/*DEBUG*/
for(i; i<reps; i++) {
printf("Producer making item %d\n", i);
num = rand();
pthread_mutex_lock(&lock);
while(pthread_cond_signal(&full))
{
pthread_cond_wait(&empty, &lock);
}
buffer[in] = num;
pthread_mutex_unlock(&lock);/*exiting critical section*/
pthread_cond_signal(&full);
in++;
if(in == BUFFER_SIZE) {
in = 0;
}
}
done = 1;
}
void * consumer() {
int num = 0;
int min=0;
int max=0;
int avg=0;
int numItems=0;
int first=1;
int reps = 3;
int sum = 0;
printf("Consumer Entering While\n");/*DEBUG*/
while(!done) {
printf("Consumer reading item %d\n", numItems);
pthread_mutex_lock(&lock);
while(pthread_cond_signal(&empty)){
pthread_cond_wait(&full, &lock);
}
num = buffer[out];
pthread_mutex_unlock(&lock); /*exit critical section*/
pthread_cond_signal(&empty);
out++;
if(out == BUFFER_SIZE)
out = 0;
/*processing*/
if(first) {
min = num;
max = num;
sum = num;
first = 0;
numItems = 1;
}
else {
if(num < min)
min = num;
sum =+ num;
if(num>max)
max = num;
numItems++;
}
}
avg = sum/numItems;/*calc avg*/
/*report stats*/
printf("Minimum: %d\n", min);
printf("Maximum: %d\n", max);
printf("Average: %d\n", avg);
printf("Items Produced: %d\n", numItems);
}
And output:
Code:
Producer in for
Consumer Entering While
Consumer reading item 0
Producer making item 0
Consumer reading item 1
Consumer reading item 2
Consumer reading item 3
Producer making item 1
Producer making item 2
Producer making item 3
Producer making item 4
Producer making item 5
Producer making item 6
Consumer reading item 4
Minimum: 0
Maximum: 4978
Average: 995
Items Produced: 5
Any advice?