semaphorelock=1;producer(){while(true){// <1> If buffer is full, wait wait(lock);add_to_buffer(next_produced);signal(lock);}}consumer(){while(true){// <2> If buffer is empty, waitwait(lock);next_consumed=take_from_buffer();signal(lock);}}
semaphorelock=1;intcount=0;producer(){while(true){wait(lock);while(count==BUFFER_SIZE);// If buffer is full, wait add_to_buffer(next_produced);count++;signal(lock);}}consumer(){while(true){wait(lock);while(count==0);// If buffer is empty, waitnext_consumed=take_from_buffer();count--;signal(lock);}}
semaphorelock=1;intcount=0;producer(){while(true){wait(lock);if(count==BUFFER_SIZE){// If buffer is full, give upsignal(lock);continue;}else{add_to_buffer(next_produced);count++;signal(lock);}}}consumer(){while(true){wait(lock);if(count==0){// If buffer is empty, give upsignal(lock);continue;}else{next_consumed=take_from_buffer();count--;signal(lock);}}}
semaphorelock=1;semaphoreeslot=BUFFER_SIZE;producer(){while(true){wait(eslot);// if buffer is full, i.e. eslot == 0, wait// else, eslot--wait(lock);add_to_buffer(next_produced);signal(lock);}}consumer(){while(true){// <2> If buffer is empty, i.e. eslot == BUFFER_SIZE, waitwait(lock);next_consumed=take_from_buffer();signal(lock);signal(eslot);// eslot++}}
semaphorelock=1;semaphoreeslot=BUFFER_SIZE;semaphorefslot=0;producer(){while(true){wait(eslot);// if buffer is full, i.e. eslot == 0, wait// else, eslot--wait(lock);add_to_buffer(next_produced);signal(lock);signal(fslot);// fslot++}}consumer(){while(true){wait(fslot);// if buffer is empty, i.e. fslot == 0, wait// else, fslot--wait(lock);next_consumed=take_from_buffer();signal(lock);signal(eslot);// eslot++}}
writer(){while(true){// if there is any reader or any other writer, waitread_and_write();}}reader(){while(true){// if there is any writer, waitread();}}
semaphorewrite_lock=1;intreader_count=0;semaphorereader_count_lock=1;writer(){while(true){wait(write_lock);read_and_write();signal(write_lock);}}reader(){while(true){wait(reader_count_lock);reader_count++;if(reader_count==1)// first reader take write_lockwait(write_lock);signal(reader_count_lock);read();wait(reader_count_lock);reader_count--;if(reader_count==0)// release write_lock when ...signal(write_lock);// ... no other readers readingsignal(reader_count_lock);}}
vector<semaphore>chopstick(5,1);// initialize semaphores to all 1philosopher(intindex){while(true){wait(chopstick[i]);wait(chopstick[(i+1)%5]);eat();signal(chopstick[i]);signal(chopstick[(i+1)%5]);think();}}
vector<semaphore>chopstick(5,1);// initialize semaphores to all 1semaphorelock=1;philosopher(intindex){while(true){wait(lock);wait(chopstick[i]);wait(chopstick[(i+1)%5]);signal(lock);eat();signal(chopstick[i]);signal(chopstick[(i+1)%5]);think();}}