【问题标题】:Using two semaphores in one method在一种方法中使用两个信号量
【发布时间】:2019-05-26 16:44:17
【问题描述】:

我被这个任务困住了,我无法理解它。

假设有一排游客在排队等候进入其中一辆车。一次只能开一辆车到站台接 2 个等候的人。一旦有 2 名访客进入汽车,它就必须离开平台。

我需要将以下方法“carArrives()”和“visitorArrives()”从 Busy - Waiting 更改为仅使用 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;

}

【问题讨论】:

  • 太棒了!我希望你能通过解决这个问题学到很多东西。你有问题吗?因为我什么都看不到。 “请做我的功课”也不是问题。
  • OT:关于像这样的陈述:while(availableCars &gt; 0){noop;} 这会更好写成:while(availableCars &gt; 0){;}
  • @user3629249,甚至只使用 ; 而不使用花括号 {}。但它应该使用信号量或互斥量来做某事......然后他从不使用它们...... 8-.

标签: c synchronization mutex semaphore


【解决方案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 );
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2018-02-04
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多