– Do not forget to notify waiting threads!
– predicate change =>
signal/broadcast correct condition variable
– When in doblt broadcast
– but performance loss
– You do not need a mutex to signal/broadcast
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #define BUF_SIZE 3 /* size of shared buffer */ int buffer[BUF_SIZE]; int add = 0; int rem = 0; int num = 0; pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t c_cons = PTHREAD_COND_INITIALIZER; pthread_cond_t c_prod = PTHREAD_COND_INITIALIZER; void *producer(void *param); void *consumer(void *param);
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUF_SIZE 3 /* size of shared buffer */
int buffer[BUF_SIZE];
int add = 0;
int rem = 0;
int num = 0;
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t c_cons = PTHREAD_COND_INITIALIZER;
pthread_cond_t c_prod = PTHREAD_COND_INITIALIZER;
void *producer(void *param);
void *consumer(void *param);
int main(int argc, char *argv[]){
pthread_t tid1, tid2;
int i;
if (pthread_create(&tid1, NULL, producer, NULL) != 0){
fprintf(stderr, "Unable to create producer thread\n");
exit(1);
}
if (pthread_create(&tid2, NULL, consumer, NULL) != 0){
fprintf(stderr, "Unable to create consumer thread\n");
exit(1);
}
pthread_join(tid1, NULL); /* wait for producer to exit */
pthread_join(tid2, NULL); /* wait for consumer to exit */
printf("Parent quiting\n");
}