我被这项任务卡住了,我就是想不通。
假设有一队游客在排队等着进入其中一辆车,这辆车也在排队。一次只能有一辆车开到站台去接两个等着的人。一旦两个参观者进入汽车,它就必须离开站台。
我需要将以下方法"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;
}发布于 2019-05-28 07:42:18
如果你生成一个互斥锁:
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 );
...https://stackoverflow.com/questions/56315500
复制相似问题