一种方法使用两个信号量

时间:2019-05-26 16:44:18

标签: c synchronization mutex semaphore

我被这项任务卡住了,只是无法理解。

比方说,有一排游客在等着也要排队的汽车。一次只能坐一辆车上车去接两个等待的人。一旦有2位访客进入汽车,它就必须离开平台。

我需要从忙碌中更改以下方法“ carArrives()”和“ visitorArrives()”-等待仅使用Mutex或Semaphores。

很抱歉有任何错误。

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 :(得分:0)

如果生成互斥锁:

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 );
...