#include #include "diningPh.h" DiningPh::DiningPh() { for ( int i = 0; i < 5; i++ ) { state[ i ] = Thinking; } } DiningPh::~DiningPh() { } void DiningPh::pickup( long who ) { std::unique_lock lock( dp ); state[ who ] = Hungry; test( who ); if ( state[ who ] == Hungry ) self[ who ].wait( lock ); } void DiningPh::putdown( long who ) { std::unique_lock lock( dp ); state[ who ] = Thinking; test( (who + 4) % 5 ); test( (who + 1) % 5 ); } void DiningPh::test( long i ) { if ( ( state[ (i + 4) % 5 ] != Eating ) && ( state[ i ] == Hungry ) && ( state[ (i + 1) % 5] != Eating ) ) { state[ i ] = Eating; self[ i ].notify_one(); } } void DiningPh::print() { for ( int i = 0; i < 5; i++ ) { printf( "Philosopher %d is %s \n", i + 1, (state[i]==Hungry)?"Hungry":(state[i]==Thinking)?"Thinking":"Eating"); } }