#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
#define BUFFER_SIZE 100 // Adjust buffer size as needed
sem_t mutex, full, empty;
int buff[BUFFER_SIZE];
int in = 0, out = 0; // Indexes for producer and consumer
void producer(void *arg) {
int item;
while (1) {
printf("Enter the item to be produced (or -1 to exit): "); if (scanf("%d", &item
) != 1 || item
== -1) { break; // Exit producer if user enters -1 or input error
}
sem_wait(&empty); // Wait if buffer is full
sem_wait(&mutex); // Enter critical section
// Critical section: Add item to buffer
buff[in] = item;
printf("Item %d stored in buffer\n", buff
[in
]); in = (in + 1) % BUFFER_SIZE; // Circular buffer logic
sem_post(&mutex); // Exit critical section
sem_post(&full); // Signal a full slot
}
}
void consumer(void *arg) {
int item;
while (1) {
sem_wait(&full); // Wait if buffer is empty
sem_wait(&mutex); // Enter critical section
// Critical section: Remove item from buffer
item = buff[out];
printf("Item %d consumed from buffer\n", item
); out = (out + 1) % BUFFER_SIZE; // Circular buffer logic
sem_post(&mutex); // Exit critical section
sem_post(&empty); // Signal an empty slot
}
}
int main() {
int m, n; // Number of producers and consumers
printf("Enter the number of producers: "); printf("Enter the number of consumers: ");
// Semaphore initialization (corrected initialization values)
sem_init(&mutex, 0, 1);
sem_init(&full, 0, 0); // Initially no full slots
sem_init(&empty, 0, BUFFER_SIZE); // Initially all slots empty
// Thread creation
pthread_t producers[m], consumers[n];
for (int i = 0; i < m; i++) {
pthread_create(&producers[i], NULL, producer, NULL);
}
for (int i = 0; i < n; i++) {
pthread_create(&consumers[i], NULL, consumer, NULL);
}
// Wait for threads to finish
for (int i = 0; i < m; i++) {
pthread_join(producers[i], NULL);
}
for (int i = 0; i < n; i++) {
pthread_join(consumers[i], NULL);
}
printf("All producers and consumers finished.\n"); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KCiNkZWZpbmUgQlVGRkVSX1NJWkUgMTAwIC8vIEFkanVzdCBidWZmZXIgc2l6ZSBhcyBuZWVkZWQKCnNlbV90IG11dGV4LCBmdWxsLCBlbXB0eTsKaW50IGJ1ZmZbQlVGRkVSX1NJWkVdOwppbnQgaW4gPSAwLCBvdXQgPSAwOyAvLyBJbmRleGVzIGZvciBwcm9kdWNlciBhbmQgY29uc3VtZXIKCnZvaWQgcHJvZHVjZXIodm9pZCAqYXJnKSB7CiAgICBpbnQgaXRlbTsKICAgIHdoaWxlICgxKSB7CiAgICAgICAgcHJpbnRmKCJFbnRlciB0aGUgaXRlbSB0byBiZSBwcm9kdWNlZCAob3IgLTEgdG8gZXhpdCk6ICIpOwogICAgICAgIGlmIChzY2FuZigiJWQiLCAmaXRlbSkgIT0gMSB8fCBpdGVtID09IC0xKSB7CiAgICAgICAgICAgIGJyZWFrOyAvLyBFeGl0IHByb2R1Y2VyIGlmIHVzZXIgZW50ZXJzIC0xIG9yIGlucHV0IGVycm9yCiAgICAgICAgfQoKICAgICAgICBzZW1fd2FpdCgmZW1wdHkpOyAvLyBXYWl0IGlmIGJ1ZmZlciBpcyBmdWxsCiAgICAgICAgc2VtX3dhaXQoJm11dGV4KTsgIC8vIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24KCiAgICAgICAgLy8gQ3JpdGljYWwgc2VjdGlvbjogQWRkIGl0ZW0gdG8gYnVmZmVyCiAgICAgICAgYnVmZltpbl0gPSBpdGVtOwogICAgICAgIHByaW50ZigiSXRlbSAlZCBzdG9yZWQgaW4gYnVmZmVyXG4iLCBidWZmW2luXSk7CiAgICAgICAgaW4gPSAoaW4gKyAxKSAlIEJVRkZFUl9TSVpFOyAvLyBDaXJjdWxhciBidWZmZXIgbG9naWMKCiAgICAgICAgc2VtX3Bvc3QoJm11dGV4KTsgIC8vIEV4aXQgY3JpdGljYWwgc2VjdGlvbgogICAgICAgIHNlbV9wb3N0KCZmdWxsKTsgICAvLyBTaWduYWwgYSBmdWxsIHNsb3QKICAgIH0KfQoKdm9pZCBjb25zdW1lcih2b2lkICphcmcpIHsKICAgIGludCBpdGVtOwogICAgd2hpbGUgKDEpIHsKICAgICAgICBzZW1fd2FpdCgmZnVsbCk7IC8vIFdhaXQgaWYgYnVmZmVyIGlzIGVtcHR5CiAgICAgICAgc2VtX3dhaXQoJm11dGV4KTsgIC8vIEVudGVyIGNyaXRpY2FsIHNlY3Rpb24KCiAgICAgICAgLy8gQ3JpdGljYWwgc2VjdGlvbjogUmVtb3ZlIGl0ZW0gZnJvbSBidWZmZXIKICAgICAgICBpdGVtID0gYnVmZltvdXRdOwogICAgICAgIHByaW50ZigiSXRlbSAlZCBjb25zdW1lZCBmcm9tIGJ1ZmZlclxuIiwgaXRlbSk7CiAgICAgICAgb3V0ID0gKG91dCArIDEpICUgQlVGRkVSX1NJWkU7IC8vIENpcmN1bGFyIGJ1ZmZlciBsb2dpYwoKICAgICAgICBzZW1fcG9zdCgmbXV0ZXgpOyAgLy8gRXhpdCBjcml0aWNhbCBzZWN0aW9uCiAgICAgICAgc2VtX3Bvc3QoJmVtcHR5KTsgICAvLyBTaWduYWwgYW4gZW1wdHkgc2xvdAogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIGludCBtLCBuOyAvLyBOdW1iZXIgb2YgcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMKCiAgICBwcmludGYoIkVudGVyIHRoZSBudW1iZXIgb2YgcHJvZHVjZXJzOiAiKTsKICAgIHNjYW5mKCIlZCIsICZtKTsKICAgIHByaW50ZigiRW50ZXIgdGhlIG51bWJlciBvZiBjb25zdW1lcnM6ICIpOwogICAgc2NhbmYoIiVkIiwgJm4pOwoKICAgIC8vIFNlbWFwaG9yZSBpbml0aWFsaXphdGlvbiAoY29ycmVjdGVkIGluaXRpYWxpemF0aW9uIHZhbHVlcykKICAgIHNlbV9pbml0KCZtdXRleCwgMCwgMSk7CiAgICBzZW1faW5pdCgmZnVsbCwgMCwgMCk7ICAvLyBJbml0aWFsbHkgbm8gZnVsbCBzbG90cwogICAgc2VtX2luaXQoJmVtcHR5LCAwLCBCVUZGRVJfU0laRSk7IC8vIEluaXRpYWxseSBhbGwgc2xvdHMgZW1wdHkKCiAgICAvLyBUaHJlYWQgY3JlYXRpb24KICAgIHB0aHJlYWRfdCBwcm9kdWNlcnNbbV0sIGNvbnN1bWVyc1tuXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgcHRocmVhZF9jcmVhdGUoJnByb2R1Y2Vyc1tpXSwgTlVMTCwgcHJvZHVjZXIsIE5VTEwpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmY29uc3VtZXJzW2ldLCBOVUxMLCBjb25zdW1lciwgTlVMTCk7CiAgICB9CgogICAgLy8gV2FpdCBmb3IgdGhyZWFkcyB0byBmaW5pc2gKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgcHRocmVhZF9qb2luKHByb2R1Y2Vyc1tpXSwgTlVMTCk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHB0aHJlYWRfam9pbihjb25zdW1lcnNbaV0sIE5VTEwpOwogICAgfQoKICAgIHByaW50ZigiQWxsIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIGZpbmlzaGVkLlxuIik7CiAgICByZXR1cm4gMDsKfQo=