pthread_cond_t cv_notfull = PTHREAD_COND_INITIALIZER;
pthread_cond_t cv_notempty = PTHREAD_COND_INITIALIZER;
pthread_cond_t cv_busfull = PTHREAD_COND_INITIALIZER;
pthread_mutex_t bus_access = PTHREAD_MUTEX_INITIALIZER;
void *cvpass(void *pass_id)
{
int *my_id = (int *) pass_id;
int trips = 0;
while (trips < T) {
while (pthread_mutex_trylock(&bus_access)) ;
while (pthread_cond_wait(&cv_notfull, &bus_access)) ; // wait for access
// cout<<*my_id<<" acquires lock\n";
cout<<"Passenger "<<*my_id<<" gets in\n";
id_queue.push_back(*my_id);
num_passengers++;
// cout<<"# passengers: "<
// sleep(1); // wait for bus to be ready to receive bus_full
// cout<<"Bus full, signaling bus_full\n";
pthread_cond_signal(&cv_busfull);
}
// pthread_mutex_unlock(&bus_access);
// cout<<*my_id<<" releases lock\n";
pthread_cond_wait(&cv_notempty, &bus_access);
if (on_bus(id_queue, *my_id))
{
id_queue.remove(*my_id);
cout<<"Passenger "<<*my_id<<" gets off\n";
num_passengers--;
// cout<<"# passengers: "<
pthread_mutex_unlock(&bus_access);
trips++;
}
pthread_exit(NULL);
}
Comment