#include <iostream>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t printerSemaphore; // Semaphore for shared printer
void* usePrinter(void* arg) {
int id = *((int*)arg);
sem_wait(&printerSemaphore); // Wait (P operation)
std::cout << "Process " << id << " is using the printer...\n";
sleep(2); // Simulate using the printer
std::cout << "Process " << id << " is done printing.\n";
sem_post(&printerSemaphore); // Signal (V operation)
return nullptr;
}
int main() {
pthread_t t1, t2;
int id1 = 1, id2 = 2;
sem_init(&printerSemaphore, 0, 1); // Binary semaphore initialized to 1
pthread_create(&t1, nullptr, usePrinter, &id1);
pthread_create(&t2, nullptr, usePrinter, &id2);
pthread_join(t1, nullptr);
pthread_join(t2, nullptr);
sem_destroy(&printerSemaphore);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8c2VtYXBob3JlLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCnNlbV90IHByaW50ZXJTZW1hcGhvcmU7ICAvLyBTZW1hcGhvcmUgZm9yIHNoYXJlZCBwcmludGVyCgp2b2lkKiB1c2VQcmludGVyKHZvaWQqIGFyZykgewogICAgaW50IGlkID0gKigoaW50KilhcmcpOwoKICAgIHNlbV93YWl0KCZwcmludGVyU2VtYXBob3JlKTsgIC8vIFdhaXQgKFAgb3BlcmF0aW9uKQogICAgc3RkOjpjb3V0IDw8ICJQcm9jZXNzICIgPDwgaWQgPDwgIiBpcyB1c2luZyB0aGUgcHJpbnRlci4uLlxuIjsKICAgIHNsZWVwKDIpOyAgLy8gU2ltdWxhdGUgdXNpbmcgdGhlIHByaW50ZXIKICAgIHN0ZDo6Y291dCA8PCAiUHJvY2VzcyAiIDw8IGlkIDw8ICIgaXMgZG9uZSBwcmludGluZy5cbiI7CiAgICBzZW1fcG9zdCgmcHJpbnRlclNlbWFwaG9yZSk7ICAvLyBTaWduYWwgKFYgb3BlcmF0aW9uKQoKICAgIHJldHVybiBudWxscHRyOwp9CgppbnQgbWFpbigpIHsKICAgIHB0aHJlYWRfdCB0MSwgdDI7CiAgICBpbnQgaWQxID0gMSwgaWQyID0gMjsKCiAgICBzZW1faW5pdCgmcHJpbnRlclNlbWFwaG9yZSwgMCwgMSk7ICAvLyBCaW5hcnkgc2VtYXBob3JlIGluaXRpYWxpemVkIHRvIDEKCiAgICBwdGhyZWFkX2NyZWF0ZSgmdDEsIG51bGxwdHIsIHVzZVByaW50ZXIsICZpZDEpOwogICAgcHRocmVhZF9jcmVhdGUoJnQyLCBudWxscHRyLCB1c2VQcmludGVyLCAmaWQyKTsKCiAgICBwdGhyZWFkX2pvaW4odDEsIG51bGxwdHIpOwogICAgcHRocmVhZF9qb2luKHQyLCBudWxscHRyKTsKCiAgICBzZW1fZGVzdHJveSgmcHJpbnRlclNlbWFwaG9yZSk7CiAgICByZXR1cm4gMDsKfQo=