c - 在一种方法中使用两个信号量

标签 c synchronization mutex semaphore

我被这项任务困住了,无法集中注意力。

假设有一群游客正在排队等待进入其中一辆也排队的汽车。一次只能开一辆车到站台接载 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/

相关文章:

multithreading - 如何在 Golang 中并发读取和写入文件?

c - 计算

java - 放入 session 中并具有动态 getter 的对象是否应该是线程安全的

c++ - 在 C 或 C++ 中打开 jpeg 或 png 图像作为像素数据

c++ - 在计算机之间同步对象列表的模式(在 C++ 中)?

c# - 命名互斥体的单声道替代品

c# - 为什么这个程序会出错? `Object synchronization method was called from an unsynchronized block of code`

c++ - pthread_mutex_lock 上的核心转储

c - 在 printf 语句中使用 strcpy 或 strcat 时,是否会对字符串进行不必要的更改?

c - 在 c 中读取文件后,我的打印函数中出现了错误