我被这项任务困住了,无法集中注意力。
假设有一群游客正在排队等待进入其中一辆也排队的汽车。一次只能开一辆车到站台接载 2 名等候的人。一旦 2 名访客进入汽车,汽车就必须离开站台。
我需要将以下方法“carArrives()”和“visitorArrives()”从“忙碌 - 等待”更改为仅使用互斥体或信号量。
抱歉有任何错误。
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;
}
最佳答案
如果生成互斥锁:
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 );
...
关于c - 在一种方法中使用两个信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56315500/