#include #include #include #include #include "rcmon.h" #include "rollercoaster.h" using namespace std; RCMon::RCMon () { pthread_mutex_init (&monlock,nullptr); pthread_cond_init (&car,nullptr); pthread_cond_init (&board,nullptr); pthread_cond_init (&unboard,nullptr); } RCMon::~RCMon () { pthread_mutex_destroy (&monlock); pthread_cond_destroy (&car); pthread_cond_destroy (&board); pthread_cond_destroy (&unboard); } void RCMon::Board (int id) { pthread_mutex_lock (&monlock); //mbegin if (nr==getC()) { nrw++; cout << "Rider " << id << " waiting to board!" << endl; pthread_cond_wait (&board,&monlock); //wait on board condition, associating it with monlock /* This is (essentially) pthread_mutex_unlock (monlock); pthread_mutex_lock (board); pthread_mutex_lock (monlock); */ cout << "Rider " << id << " boarding." << endl; if (nr==getC()) pthread_cond_signal (&car); else if (nrw > 0) { nrw--; nr++; pthread_cond_signal (&board); } } else { nr++; cout << "Rider " << id << " boarding." << endl; if (nr==getC()) pthread_cond_signal (&car); } pthread_mutex_unlock (&monlock); //mend } void RCMon::Unboard (int id) { pthread_mutex_lock (&monlock); pthread_cond_wait (&unboard,&monlock); cout << "Rider " << id << " unboarding." << endl; if (nr > 0) { nr--; pthread_cond_signal (&unboard); } else if (nrw > 0) { //I'm the last guy and someone else is waiting nrw--; nr++; pthread_cond_signal (&board); } pthread_mutex_unlock (&monlock); } void RCMon::BeginRide () { pthread_mutex_lock (&monlock); pthread_cond_wait (&car,&monlock); cout << "Car: Driving" << endl; pthread_mutex_unlock (&monlock); } void RCMon::EndRide () { pthread_mutex_lock (&monlock); cout << "Car: Ride over" << endl; nr--; pthread_cond_signal (&unboard); pthread_mutex_unlock (&monlock); }