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