Использование двух семафоров в одном методе - PullRequest
0 голосов
/ 26 мая 2019

Я застрял на этом задании и просто не могу разобраться с этим.

Допустим, есть очередь посетителей, ожидающих, чтобы сесть в одну из машин, которые также стоят в очереди. Только одна машина за один раз должна подъехать к платформе, чтобы забрать 2 ожидающих людей. Как только 2 посетителя входят в машину, она должна покинуть платформу.

Мне нужно изменить следующие методы "carArrives ()" и "visitorArrives ()" из Busy - в ожидании использования только Mutex или семафоров.

Извините за любые ошибки.

int availableCars = 0;
int availableSeats = 0;


void carArrives(){
     while(availableCars > 0){noop;}   //exchange this with Mutex/Semaphore
     availableCars = 1;
     driveToPlatform();
     openDoors();
     availableSeats = 2;
     while(availableSeats > 0){noop;} //exchange this with Mutex/Semaphore
     closeDoors();
     leavePlatform();
     availableCars = 0;
}

void visitorArrives(){
     while(availableSeats < 1){noop;} //exchange this with Mutex/Semaphore
     enterCar();
     availableSeats = availableSeats - 1;

}

1 Ответ

0 голосов
/ 28 мая 2019

если вы генерируете мьютекс:

pthread_mutex MyMutex = PTHREAD_MUTEX_INIT;

Затем, чтобы остановить любую другую часть программы от изменения какого-либо ресурса, пока текущий поток изменяет / обращается к ресурсу:

pthread_mutex_lock( &MyMutex );
// modify or access resource here
pthread_mutex_unlock( &MyMutex );

Примечание: чтобы быть эффективным, все места в коде, которые обращаются к этому ресурсу, должны использовать один и тот же 'MyMutex'

относительно:

availableSeats = 2;
while(availableSeats > 0){noop;}

Рекомендуется между блокировкой мьютекса для того же ресурса, чтобы сделать небольшую паузу, пока она не заблокирована, чтобы позволить другому потоку какое-то время изменить значение 'availableSeats'. Например:

pthread_mutex SeatsFilled = PTHREAD_MUTEX_INIT;
...
pthread_mutex_lock( &SeatsFilled );
availableSeats = 2;
pthread_mutex_unlock( &SeatsFilled );
...
do
{
    int numSeats;
    pthread_mutex_lock( &SeatsFilled );
    numSeats = availableSeats;
    pthread_mutex_unlock( &SeatsFilled );

    if( !numSeats )
    {
        nanosleep( 1000 );
    }
} while( numSeats );
...
...