From 10de30656a8da87ce2275508c886ecbd4e479eb5 Mon Sep 17 00:00:00 2001 From: Kshitij Date: Wed, 6 Nov 2024 15:38:23 +0530 Subject: [PATCH] Added code b4 (Mutex and Semaphore) --- Codes/Group B/Code-B4.cpp | 70 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Codes/Group B/Code-B4.cpp diff --git a/Codes/Group B/Code-B4.cpp b/Codes/Group B/Code-B4.cpp new file mode 100644 index 0000000..e3682fe --- /dev/null +++ b/Codes/Group B/Code-B4.cpp @@ -0,0 +1,70 @@ +// Assignment A4 - (MUTEX AND SEMAPHORE) + +#include +using namespace std; + +class Synchronization { + int a[10]; // Increased buffer size to 10 + int mutex; + int empty; + int full; + int in; + int out; + + void wait(int &x) { + if (x > 0) x--; + } + + void signal(int &x) { + x++; + } + +public: + Synchronization() : mutex(1), empty(10), full(0), in(0), out(0) {} + + void producer() { + if (empty > 0 && mutex == 1) { + wait(empty); + wait(mutex); + cout << "Data to be produced: "; + int data; + cin >> data; + a[in] = data; + in = (in + 1) % 10; // Update for new buffer size + signal(mutex); + signal(full); + } else { + cout << "Buffer is full, cannot produce!" << endl; + } + } + + void consumer() { + if (full > 0 && mutex == 1) { + wait(full); + wait(mutex); + cout << "Data consumed is: " << a[out] << endl; // Show consumed data + out = (out + 1) % 10; // Update for new buffer size + signal(mutex); + signal(empty); + } else { + cout << "Buffer is empty, cannot consume!" << endl; + } + } +}; + +int main() { + int fchoice; + Synchronization s; + do { + cout << "1. Producer\n2. Consumer\n3. Exit" << endl; + cout << "Enter your choice: "; + cin >> fchoice; + switch (fchoice) { + case 1: s.producer(); break; + case 2: s.consumer(); break; + case 3: break; + default: cout << "Invalid choice!" << endl; break; + } + } while (fchoice != 3); + return 0; +}