首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一个方法中使用两个信号量

在一个方法中使用两个信号量
EN

Stack Overflow用户
提问于 2019-05-27 00:44:18
回答 1查看 201关注 0票数 0

我被这项任务卡住了,我就是想不通。

假设有一队游客在排队等着进入其中一辆车,这辆车也在排队。一次只能有一辆车开到站台去接两个等着的人。一旦两个参观者进入汽车,它就必须离开站台。

我需要将以下方法"carArrives()“和"visitorArrives()”从繁忙等待改为只使用互斥锁或信号量。

对于任何错误,我深表歉意。

代码语言:javascript
复制
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;

}
EN

回答 1

Stack Overflow用户

发布于 2019-05-28 07:42:18

如果你生成一个互斥锁:

代码语言:javascript
复制
pthread_mutex MyMutex = PTHREAD_MUTEX_INIT;

然后在当前线程修改/访问某个资源时,停止程序的任何其他部分修改该资源:

代码语言:javascript
复制
pthread_mutex_lock( &MyMutex );
// modify or access resource here
pthread_mutex_unlock( &MyMutex );

注意:为了有效,代码中访问该资源的所有位置必须使用相同的“MyMutex”

关于:

代码语言:javascript
复制
availableSeats = 2;
while(availableSeats > 0){noop;}

建议在锁定同一资源互斥锁之间,在未锁定时暂停一段时间,以便让其他线程有时间修改“availableSeats”值。例如:

代码语言:javascript
复制
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 );
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56315500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档