#include <stdio.h>
#include <pthread.h>

int value = 0, ready = 0;
pthread_mutex_t lock;
pthread_cond_t available;

void *produce(void *argument) {
    (void)argument;
    int answer = 6 * 7;
    pthread_mutex_lock(&lock);
    value = answer;
    ready = 1;
    pthread_cond_signal(&available);
    pthread_mutex_unlock(&lock);
    return NULL;
}

void *consume(void *argument) {
    (void)argument;
    pthread_mutex_lock(&lock);
    while (!ready) {
        pthread_cond_wait(&available, &lock);
    }
    int result = value;
    pthread_mutex_unlock(&lock);
    printf("Consumer received: %d\n", result);
    return NULL;
}

int main(void) {
    pthread_t producer, consumer;
    pthread_mutex_init(&lock, NULL);
    pthread_cond_init(&available, NULL);
    pthread_create(&consumer, NULL, consume, NULL);
    pthread_create(&producer, NULL, produce, NULL);
    pthread_join(producer, NULL);
    pthread_join(consumer, NULL);
    pthread_cond_destroy(&available);
    pthread_mutex_destroy(&lock);
    printf("Both workers finished\n");
    return 0;
}
