#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
int *buffer;
int size, in = 0, out = 0;
sem_t empty, full;
pthread_mutex_t mutex;
void *producer(void *arg) {
int n, item;
printf("Enter number of items to produce: "); for (int i = 0; i < n; i++) {
printf("Enter item %d to produce: ", i
+ 1); sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[in] = item;
printf("Produced: %d\n", item
); in = (in + 1) % size;
pthread_mutex_unlock(&mutex);
sem_post(&full);
sleep(1);
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int n, item;
printf("Enter number of items to consume: "); for (int i = 0; i < n; i++) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
item = buffer[out];
printf("Consumed: %d\n", item
); out = (out + 1) % size;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
sleep(1);
}
pthread_exit(NULL);
}
int main() {
pthread_t prod, cons;
printf("Enter buffer size: "); buffer
= malloc(size
* sizeof(int)); sem_init(&empty, 0, size);
sem_init(&full, 0, 0);
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);
pthread_mutex_destroy(&mutex);
sem_destroy(&empty);
sem_destroy(&full);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgppbnQgKmJ1ZmZlcjsKaW50IHNpemUsIGluID0gMCwgb3V0ID0gMDsKc2VtX3QgZW1wdHksIGZ1bGw7CnB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKCnZvaWQgKnByb2R1Y2VyKHZvaWQgKmFyZykgewogICAgaW50IG4sIGl0ZW07CiAgICBwcmludGYoIkVudGVyIG51bWJlciBvZiBpdGVtcyB0byBwcm9kdWNlOiAiKTsKICAgIHNjYW5mKCIlZCIsICZuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCJFbnRlciBpdGVtICVkIHRvIHByb2R1Y2U6ICIsIGkgKyAxKTsKICAgICAgICBzY2FuZigiJWQiLCAmaXRlbSk7CiAgICAgICAgc2VtX3dhaXQoJmVtcHR5KTsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKICAgICAgICBidWZmZXJbaW5dID0gaXRlbTsKICAgICAgICBwcmludGYoIlByb2R1Y2VkOiAlZFxuIiwgaXRlbSk7CiAgICAgICAgaW4gPSAoaW4gKyAxKSAlIHNpemU7CiAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKICAgICAgICBzZW1fcG9zdCgmZnVsbCk7CiAgICAgICAgc2xlZXAoMSk7CiAgICB9CiAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Cn0KCnZvaWQgKmNvbnN1bWVyKHZvaWQgKmFyZykgewogICAgaW50IG4sIGl0ZW07CiAgICBwcmludGYoIkVudGVyIG51bWJlciBvZiBpdGVtcyB0byBjb25zdW1lOiAiKTsKICAgIHNjYW5mKCIlZCIsICZuKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgc2VtX3dhaXQoJmZ1bGwpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwogICAgICAgIGl0ZW0gPSBidWZmZXJbb3V0XTsKICAgICAgICBwcmludGYoIkNvbnN1bWVkOiAlZFxuIiwgaXRlbSk7CiAgICAgICAgb3V0ID0gKG91dCArIDEpICUgc2l6ZTsKICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwogICAgICAgIHNlbV9wb3N0KCZlbXB0eSk7CiAgICAgICAgc2xlZXAoMSk7CiAgICB9CiAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Cn0KCmludCBtYWluKCkgewogICAgcHRocmVhZF90IHByb2QsIGNvbnM7CiAgICBwcmludGYoIkVudGVyIGJ1ZmZlciBzaXplOiAiKTsKICAgIHNjYW5mKCIlZCIsICZzaXplKTsKICAgIGJ1ZmZlciA9IG1hbGxvYyhzaXplICogc2l6ZW9mKGludCkpOwogICAgc2VtX2luaXQoJmVtcHR5LCAwLCBzaXplKTsKICAgIHNlbV9pbml0KCZmdWxsLCAwLCAwKTsKICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXgsIE5VTEwpOwogICAgcHRocmVhZF9jcmVhdGUoJnByb2QsIE5VTEwsIHByb2R1Y2VyLCBOVUxMKTsKICAgIHB0aHJlYWRfY3JlYXRlKCZjb25zLCBOVUxMLCBjb25zdW1lciwgTlVMTCk7CiAgICBwdGhyZWFkX2pvaW4ocHJvZCwgTlVMTCk7CiAgICBwdGhyZWFkX2pvaW4oY29ucywgTlVMTCk7CiAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4KTsKICAgIHNlbV9kZXN0cm95KCZlbXB0eSk7CiAgICBzZW1fZGVzdHJveSgmZnVsbCk7CiAgICBmcmVlKGJ1ZmZlcik7CiAgICByZXR1cm4gMDsKfQo=