有一单向行驶的公路桥,每次只允许一辆汽车通过。当汽车到桥头时,若桥上花年,便可上桥:否则需等待,直到桥上的汽车下桥为止。若每一辆汽车为一个进程,请用『、V操作编程实现
时间: 2024-05-07 08:20:21 浏览: 9
这个问题可以使用信号量来解决。我们可以定义两个信号量:一个用于表示桥上是否有汽车,另一个用于表示等待通过桥的汽车数量。
下面是一个简单的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_CARS 10
sem_t bridge;
sem_t waiting_cars;
int num_cars_on_bridge = 0;
void *car_thread(void *arg) {
int car_id = *(int *)arg;
printf("Car %d is waiting to cross the bridge\n", car_id);
sem_wait(&waiting_cars); // 等待过桥的汽车数量信号量
sem_wait(&bridge); // 等待桥上是否有汽车信号量
printf("Car %d is crossing the bridge\n", car_id);
sleep(1); // 模拟过桥时间
num_cars_on_bridge--;
sem_post(&bridge); // 释放桥上是否有汽车信号量
sem_post(&waiting_cars); // 释放等待过桥的汽车数量信号量
printf("Car %d has crossed the bridge\n", car_id);
pthread_exit(NULL);
}
int main() {
sem_init(&bridge, 0, 1);
sem_init(&waiting_cars, 0, MAX_CARS);
pthread_t cars[MAX_CARS];
int car_ids[MAX_CARS];
for (int i = 0; i < MAX_CARS; i++) {
car_ids[i] = i;
pthread_create(&cars[i], NULL, car_thread, &car_ids[i]);
}
for (int i = 0; i < MAX_CARS; i++) {
pthread_join(cars[i], NULL);
}
sem_destroy(&bridge);
sem_destroy(&waiting_cars);
return 0;
}
```
在这个代码中,我们使用了两个信号量:`bridge` 和 `waiting_cars`。`bridge` 用于表示桥上是否有汽车,初始值为1,表示桥上没有汽车。`waiting_cars` 表示等待通过桥的汽车数量,初始值为 `MAX_CARS`,表示所有汽车都在等待通过桥。
在 `car_thread` 函数中,每个汽车首先等待 `waiting_cars` 信号量,以确保桥上只有一辆车。然后等待 `bridge` 信号量,以确保桥上没有其他车。当车通过桥时,它会释放这两个信号量,以便其他车可以通过。