/** * * Dining philosophers solution using PThreads, mutex, and condition * * Compile with g++ philoPT.cc dinningPh.cc -lpthread * Unix * * Code example for CI0122 Operating systems class (Francisco Arroyo) * * 2023-i * **/ //#include #include #include #include #include #include "diningPh.h" #define NUMTHRDS 5 int status; DiningPh dp; std::mutex mtx; int main ( int argc, char *argv[] ); void Philo ( int arg ); int main ( int argc, char *argv[] ) { int i; std::thread philosophers[ NUMTHRDS ]; for ( i = 0; i < NUMTHRDS; i++ ) { philosophers[ i ] = std::thread( Philo, i ); } for ( i = 0; i < NUMTHRDS; i++ ) { philosophers[ i ].join(); } std::cout << "\n"; std::cout << " Normal end of execution.\n"; return 0; } void Philo( int who ) { int eats, thinks; for ( int i = 0; i < 10; i++ ) { mtx.lock(); std::cout << "Round " << i << " philo # " << who + 1 << std::endl; dp.print(); std::cout << " Philosopher " << who + 1 << " will try to pickup sticks" << std::endl; mtx.unlock(); dp.pickup( who ); eats = rand() % 6; sleep( eats ); dp.putdown( who ); thinks = rand() % 6; sleep( thinks ); } }