#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
volatile int turn = 0 ; // Global variable controlling process execution order
void process( int id) {
int other = 1 - id;
for ( int i = 0 ; i < 3 ; ++ i) {
// Busy wait until the process gets its turn
while ( turn ! = id) {
// Do nothing, just wait
}
// Critical section
cout << "Process " << id << " is in critical section" << endl;
this_thread:: sleep_for ( chrono:: seconds ( 1 ) ) ; // Simulating critical section delay
// Change turn to allow the other process to execute
turn = other;
// Remainder section
cout << "Process " << id << " is in remainder section" << endl;
this_thread:: sleep_for ( chrono:: milliseconds ( 500 ) ) ; // Simulating remainder section delay
}
}
int main( ) {
// Creating two threads (simulating two processes)
thread t1( process, 0 ) ;
thread t2( process, 1 ) ;
// Wait for both threads to finish
t1.join ( ) ;
t2.join ( ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8Y2hyb25vPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvbGF0aWxlIGludCB0dXJuID0gMDsgIC8vIEdsb2JhbCB2YXJpYWJsZSBjb250cm9sbGluZyBwcm9jZXNzIGV4ZWN1dGlvbiBvcmRlcgoKdm9pZCBwcm9jZXNzKGludCBpZCkgewogICAgaW50IG90aGVyID0gMSAtIGlkOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgICAgLy8gQnVzeSB3YWl0IHVudGlsIHRoZSBwcm9jZXNzIGdldHMgaXRzIHR1cm4KICAgICAgICB3aGlsZSAodHVybiAhPSBpZCkgewogICAgICAgICAgICAvLyBEbyBub3RoaW5nLCBqdXN0IHdhaXQKICAgICAgICB9CgogICAgICAgIC8vIENyaXRpY2FsIHNlY3Rpb24KICAgICAgICBjb3V0IDw8ICJQcm9jZXNzICIgPDwgaWQgPDwgIiBpcyBpbiBjcml0aWNhbCBzZWN0aW9uIiA8PCBlbmRsOwogICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjpzZWNvbmRzKDEpKTsgIC8vIFNpbXVsYXRpbmcgY3JpdGljYWwgc2VjdGlvbiBkZWxheQoKICAgICAgICAvLyBDaGFuZ2UgdHVybiB0byBhbGxvdyB0aGUgb3RoZXIgcHJvY2VzcyB0byBleGVjdXRlCiAgICAgICAgdHVybiA9IG90aGVyOwoKICAgICAgICAvLyBSZW1haW5kZXIgc2VjdGlvbgogICAgICAgIGNvdXQgPDwgIlByb2Nlc3MgIiA8PCBpZCA8PCAiIGlzIGluIHJlbWFpbmRlciBzZWN0aW9uIiA8PCBlbmRsOwogICAgICAgIHRoaXNfdGhyZWFkOjpzbGVlcF9mb3IoY2hyb25vOjptaWxsaXNlY29uZHMoNTAwKSk7ICAvLyBTaW11bGF0aW5nIHJlbWFpbmRlciBzZWN0aW9uIGRlbGF5CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgLy8gQ3JlYXRpbmcgdHdvIHRocmVhZHMgKHNpbXVsYXRpbmcgdHdvIHByb2Nlc3NlcykKICAgIHRocmVhZCB0MShwcm9jZXNzLCAwKTsKICAgIHRocmVhZCB0Mihwcm9jZXNzLCAxKTsKCiAgICAvLyBXYWl0IGZvciBib3RoIHRocmVhZHMgdG8gZmluaXNoCiAgICB0MS5qb2luKCk7CiAgICB0Mi5qb2luKCk7CgogICAgcmV0dXJuIDA7Cn0=