#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE], counter = 0;
sem_t full, empty;
pthread_mutex_t mutex;
void write_buffer(int item) {
buffer[counter++] = item;
}
int read_buffer() {
return buffer[--counter];
}
void* producer(void* param) {
sem_wait(&empty);
pthread_mutex_lock(&mutex);
write_buffer(item);
printf("Producer produced item: %d\n", item
);
pthread_mutex_unlock(&mutex);
sem_post(&full);
return NULL;
}
void* consumer(void* param) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
int item = read_buffer();
printf("Consumer consumed item: %d\n", item
);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
return NULL;
}
int main() {
int n1, n2;
pthread_t tidP[20], tidC[20];
printf("Enter number of producers: "); printf("Enter number of consumers: ");
sem_init(&full, 0, 0);
sem_init(&empty, 0, BUFFER_SIZE);
pthread_mutex_init(&mutex, NULL);
for(int i = 0; i < n1; i++)
pthread_create(&tidP[i], NULL, producer, NULL);
for(int i = 0; i < n2; i++)
pthread_create(&tidC[i], NULL, consumer, NULL);
for(int i = 0; i < n1; i++)
pthread_join(tidP[i], NULL);
for(int i = 0; i < n2; i++)
pthread_join(tidC[i], NULL);
sem_destroy(&full);
sem_destroy(&empty);
pthread_mutex_destroy(&mutex);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojZGVmaW5lIEJVRkZFUl9TSVpFIDEwCgppbnQgYnVmZmVyW0JVRkZFUl9TSVpFXSwgY291bnRlciA9IDA7CgpzZW1fdCBmdWxsLCBlbXB0eTsKcHRocmVhZF9tdXRleF90IG11dGV4OwoKdm9pZCB3cml0ZV9idWZmZXIoaW50IGl0ZW0pIHsKICAgIGJ1ZmZlcltjb3VudGVyKytdID0gaXRlbTsKfQoKaW50IHJlYWRfYnVmZmVyKCkgewogICAgcmV0dXJuIGJ1ZmZlclstLWNvdW50ZXJdOwp9Cgp2b2lkKiBwcm9kdWNlcih2b2lkKiBwYXJhbSkgewogICAgaW50IGl0ZW0gPSByYW5kKCkgJSAxMDA7CgogICAgc2VtX3dhaXQoJmVtcHR5KTsKICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwoKICAgIHdyaXRlX2J1ZmZlcihpdGVtKTsKICAgIHByaW50ZigiUHJvZHVjZXIgcHJvZHVjZWQgaXRlbTogJWRcbiIsIGl0ZW0pOwoKICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7CiAgICBzZW1fcG9zdCgmZnVsbCk7CgogICAgcmV0dXJuIE5VTEw7Cn0KCnZvaWQqIGNvbnN1bWVyKHZvaWQqIHBhcmFtKSB7CiAgICBzZW1fd2FpdCgmZnVsbCk7CiAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKCiAgICBpbnQgaXRlbSA9IHJlYWRfYnVmZmVyKCk7CiAgICBwcmludGYoIkNvbnN1bWVyIGNvbnN1bWVkIGl0ZW06ICVkXG4iLCBpdGVtKTsKCiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXV0ZXgpOwogICAgc2VtX3Bvc3QoJmVtcHR5KTsKCiAgICByZXR1cm4gTlVMTDsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgbjEsIG4yOwoKICAgIHB0aHJlYWRfdCB0aWRQWzIwXSwgdGlkQ1syMF07CgogICAgcHJpbnRmKCJFbnRlciBudW1iZXIgb2YgcHJvZHVjZXJzOiAiKTsKICAgIHNjYW5mKCIlZCIsICZuMSk7CiAgICBwcmludGYoIkVudGVyIG51bWJlciBvZiBjb25zdW1lcnM6ICIpOwogICAgc2NhbmYoIiVkIiwgJm4yKTsKCiAgICBzZW1faW5pdCgmZnVsbCwgMCwgMCk7CiAgICBzZW1faW5pdCgmZW1wdHksIDAsIEJVRkZFUl9TSVpFKTsKICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXV0ZXgsIE5VTEwpOwoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuMTsgaSsrKQogICAgICAgIHB0aHJlYWRfY3JlYXRlKCZ0aWRQW2ldLCBOVUxMLCBwcm9kdWNlciwgTlVMTCk7CgogICAgZm9yKGludCBpID0gMDsgaSA8IG4yOyBpKyspCiAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRpZENbaV0sIE5VTEwsIGNvbnN1bWVyLCBOVUxMKTsKCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgbjE7IGkrKykKICAgICAgICBwdGhyZWFkX2pvaW4odGlkUFtpXSwgTlVMTCk7CgogICAgZm9yKGludCBpID0gMDsgaSA8IG4yOyBpKyspCiAgICAgICAgcHRocmVhZF9qb2luKHRpZENbaV0sIE5VTEwpOwoKICAgIHNlbV9kZXN0cm95KCZmdWxsKTsKICAgIHNlbV9kZXN0cm95KCZlbXB0eSk7CiAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm11dGV4KTsKCgp9