#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define SIZE 5 // Size of the buffer
int buffer[SIZE];
int in = 0, out = 0;
sem_t empty, full;
pthread_mutex_t mutex;
void* producer(void* arg) {
int item;
for (int i = 0; i < 10; i++) {
item
= rand() % 100; // Produce an item
sem_wait(&empty); // Decrease empty count
pthread_mutex_lock(&mutex); // Lock the buffer
buffer[in] = item;
printf("Producer produced: %d\n", item
); in = (in + 1) % SIZE;
pthread_mutex_unlock(&mutex); // Unlock the buffer
sem_post(&full); // Increase full count
sleep(1); // Simulate time delay
}
return NULL;
}
void* consumer(void* arg) {
int item;
for (int i = 0; i < 10; i++) {
sem_wait(&full); // Decrease full count
pthread_mutex_lock(&mutex); // Lock the buffer
item = buffer[out];
printf("Consumer consumed: %d\n", item
); out = (out + 1) % SIZE;
pthread_mutex_unlock(&mutex); // Unlock the buffer
sem_post(&empty); // Increase empty count
sleep(1); // Simulate time delay
}
return NULL;
}
int main() {
pthread_t prod, cons;
sem_init(&empty, 0, SIZE); // Initially all slots are empty
sem_init(&full, 0, 0); // No items to consume
pthread_mutex_init(&mutex, NULL);
pthread_create(&prod, NULL, producer, NULL);
pthread_create(&cons, NULL, consumer, NULL);
pthread_join(prod, NULL);
pthread_join(cons, NULL);
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojZGVmaW5lIFNJWkUgNSAgLy8gU2l6ZSBvZiB0aGUgYnVmZmVyCgppbnQgYnVmZmVyW1NJWkVdOwppbnQgaW4gPSAwLCBvdXQgPSAwOwoKc2VtX3QgZW1wdHksIGZ1bGw7CnB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKCnZvaWQqIHByb2R1Y2VyKHZvaWQqIGFyZykgewogICAgaW50IGl0ZW07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKICAgICAgICBpdGVtID0gcmFuZCgpICUgMTAwOyAgLy8gUHJvZHVjZSBhbiBpdGVtCgogICAgICAgIHNlbV93YWl0KCZlbXB0eSk7ICAvLyBEZWNyZWFzZSBlbXB0eSBjb3VudAogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOyAgLy8gTG9jayB0aGUgYnVmZmVyCgogICAgICAgIGJ1ZmZlcltpbl0gPSBpdGVtOwogICAgICAgIHByaW50ZigiUHJvZHVjZXIgcHJvZHVjZWQ6ICVkXG4iLCBpdGVtKTsKICAgICAgICBpbiA9IChpbiArIDEpICUgU0laRTsKCiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsgIC8vIFVubG9jayB0aGUgYnVmZmVyCiAgICAgICAgc2VtX3Bvc3QoJmZ1bGwpOyAgLy8gSW5jcmVhc2UgZnVsbCBjb3VudAoKICAgICAgICBzbGVlcCgxKTsgIC8vIFNpbXVsYXRlIHRpbWUgZGVsYXkKICAgIH0KICAgIHJldHVybiBOVUxMOwp9Cgp2b2lkKiBjb25zdW1lcih2b2lkKiBhcmcpIHsKICAgIGludCBpdGVtOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgICAgc2VtX3dhaXQoJmZ1bGwpOyAgLy8gRGVjcmVhc2UgZnVsbCBjb3VudAogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOyAgLy8gTG9jayB0aGUgYnVmZmVyCgogICAgICAgIGl0ZW0gPSBidWZmZXJbb3V0XTsKICAgICAgICBwcmludGYoIkNvbnN1bWVyIGNvbnN1bWVkOiAlZFxuIiwgaXRlbSk7CiAgICAgICAgb3V0ID0gKG91dCArIDEpICUgU0laRTsKCiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsgIC8vIFVubG9jayB0aGUgYnVmZmVyCiAgICAgICAgc2VtX3Bvc3QoJmVtcHR5KTsgIC8vIEluY3JlYXNlIGVtcHR5IGNvdW50CgogICAgICAgIHNsZWVwKDEpOyAgLy8gU2ltdWxhdGUgdGltZSBkZWxheQogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCmludCBtYWluKCkgewogICAgcHRocmVhZF90IHByb2QsIGNvbnM7CgogICAgc2VtX2luaXQoJmVtcHR5LCAwLCBTSVpFKTsgIC8vIEluaXRpYWxseSBhbGwgc2xvdHMgYXJlIGVtcHR5CiAgICBzZW1faW5pdCgmZnVsbCwgMCwgMCk7ICAgICAgLy8gTm8gaXRlbXMgdG8gY29uc3VtZQogICAgcHRocmVhZF9tdXRleF9pbml0KCZtdXRleCwgTlVMTCk7CgogICAgcHRocmVhZF9jcmVhdGUoJnByb2QsIE5VTEwsIHByb2R1Y2VyLCBOVUxMKTsKICAgIHB0aHJlYWRfY3JlYXRlKCZjb25zLCBOVUxMLCBjb25zdW1lciwgTlVMTCk7CgogICAgcHRocmVhZF9qb2luKHByb2QsIE5VTEwpOwogICAgcHRocmVhZF9qb2luKGNvbnMsIE5VTEwpOwoKICAgIHNlbV9kZXN0cm95KCZlbXB0eSk7CiAgICBzZW1fZGVzdHJveSgmZnVsbCk7CiAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4KTsKCiAgICByZXR1cm4gMDsKfQo=