2. 计算题 某条河上只有一座独木桥,以便行人过河。现在河的两边东西方向都有人要过桥,每次只能有一个人通过,且不允许人在桥上停留,请用P、V操作实现东西两端人过桥的问题。用C语言实现
时间: 2024-10-13 18:04:26 浏览: 12
这是一个典型的生产者消费者问题,可以使用互斥量(mutex)和条件变量(condition variable)来解决。在C语言中,可以利用`pthread`库提供的功能来模拟这个场景。下面是一个简化的伪代码示例:
```c
#include <pthread.h>
#include <stdio.h>
#define MAX_PEOPLE 2 // 桥的最大通行人数
int people_on_bridge = 0; // 当前桥上的人数
pthread_mutex_t bridge_lock; // 互斥锁
pthread_cond_t people_wait; // 条件变量
void* producer(void* arg) {
int person = 1;
while (true) {
pthread_mutex_lock(&bridge_lock);
if (people_on_bridge == MAX_PEOPLE) { // 如果满员,等待消费者离开
pthread_cond_wait(&people_wait, &bridge_lock);
}
printf("Producer %d starts crossing the bridge.\n", person++);
people_on_bridge++; // 增加桥上人数
pthread_mutex_unlock(&bridge_lock);
// 模拟过桥时间...
sleep(2); // 这里只是一个例子,实际应用中应根据实际情况调整
pthread_mutex_lock(&bridge_lock);
people_on_bridge--; // 减少桥上人数
if (people_on_bridge == 0) {
pthread_cond_signal(&people_wait); // 唤醒等待的消费者
}
pthread_mutex_unlock(&bridge_lock);
}
}
void* consumer(void* arg) {
while (true) {
pthread_mutex_lock(&bridge_lock);
if (people_on_bridge == 0) { // 如果没人,等待生产者过来
pthread_cond_wait(&people_wait, &bridge_lock);
}
printf("Consumer %d starts crossing the bridge.\n", (int)arg + 1);
people_on_bridge++;
pthread_mutex_unlock(&bridge_lock);
// 模拟过桥时间...
sleep(1); // 这里也是一个例子,实际应用中同理
pthread_mutex_lock(&bridge_lock);
people_on_bridge--;
if (people_on_bridge == 0) {
pthread_cond_signal(&people_wait); // 唤醒等待的另一个消费者
}
pthread_mutex_unlock(&bridge_lock);
}
}
int main() {
pthread_t producer_thread, consumer_thread;
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, (void*)1);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
```
在这个例子中,`producer`线程模拟生产者过桥,`consumer`线程模拟消费者过桥。互斥量保证了任何时候只有一个线程能访问桥梁,条件变量使得线程可以在必要时进入等待状态直到其他线程满足其条件。
阅读全文