在公共汽车上,司机和售票员的工作流程如图所示。为保证乘客的安全,司机和售票员应密切配合协调工作。请用信号量来实现司机与售票员之间的同步。
时间: 2024-05-01 07:16:44 浏览: 12
以下是使用信号量实现司机与售票员同步的示例代码:
```c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_PASSENGERS 50
sem_t driver_sem; // 司机信号量
sem_t conductor_sem; // 售票员信号量
int passengers_boarded = 0; // 上车乘客数量
int passengers_paid = 0; // 已付款乘客数量
void *driver(void *arg)
{
while (passengers_boarded < MAX_PASSENGERS) {
sem_wait(&conductor_sem); // 等待售票员发出上车信号
printf("Driver: All aboard!\n");
sem_post(&driver_sem); // 发出开车信号
}
printf("Driver: The bus is full. Let's go!\n");
pthread_exit(NULL);
}
void *conductor(void *arg)
{
while (passengers_paid < MAX_PASSENGERS) {
sem_post(&conductor_sem); // 发出上车信号
sem_wait(&driver_sem); // 等待司机发出开车信号
printf("Conductor: Collecting fares...\n");
passengers_paid++;
passengers_boarded++;
}
printf("Conductor: All passengers have paid. Let's go!\n");
pthread_exit(NULL);
}
int main()
{
pthread_t driver_thread, conductor_thread;
sem_init(&driver_sem, 0, 0);
sem_init(&conductor_sem, 0, 0);
pthread_create(&driver_thread, NULL, driver, NULL);
pthread_create(&conductor_thread, NULL, conductor, NULL);
pthread_join(driver_thread, NULL);
pthread_join(conductor_thread, NULL);
sem_destroy(&driver_sem);
sem_destroy(&conductor_sem);
return 0;
}
```
在这个示例中,司机和售票员分别运行在两个不同的线程中,它们之间通过信号量进行同步。当售票员发出上车信号时,司机会等待并接受该信号,然后发出开车信号,允许乘客上车。当司机发出开车信号时,售票员会等待并接受该信号,然后开始收取车费。最终当所有乘客都上车并付款后,司机和售票员都会退出线程。
需要注意的是,在本例中我们使用了两个信号量来实现同步。一个信号量用于司机等待售票员发出上车信号,另一个信号量用于售票员等待司机发出开车信号。这种方式可以保证司机和售票员之间的同步,从而保证了乘客的安全。