小河上有一座独木桥,连接着东西两岸,一次只能走一个人,如果把每个过桥的人看做一个进程,请用PV操作用c++代码实现实现管理。
时间: 2024-10-10 07:02:44 浏览: 18
要使用PV操作(Producer-Consumer Problem)来管理小河上的独木桥,我们可以创建一个简单的生产者(PersonPro)和消费者(PersonCon)类,并在其中使用互斥量(mutex)、条件变量(condition_variable)来同步他们的行动。这里是一个基本的C++实现:
```cpp
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
class Person {
public:
void cross_bridge(std::string name) {
std::lock_guard<std::mutex> lock(mutex);
bridge_crossed++;
if (bridge_crossed % 2 == 0) { // 桥上已经有一个人,等待
condition.notify_one();
std::unique_lock<std::mutex> notify_lock(condition_mutex);
condition.wait(notify_lock, [] { return bridge_empty; });
}
std::cout << "Person " << name << " crossed the bridge.\n";
bridge_empty = false;
}
private:
static int bridge_crossed = 0;
static bool bridge_empty = true;
mutable std::mutex mutex;
std::mutex condition_mutex;
std::condition_variable condition;
};
int Person::bridge_crossed = 0;
bool Person::bridge_empty = true;
// 生产者:模拟人从东岸来
void producer(Person& bridge) {
for (int i = 0; i < 5; ++i) {
std::this_thread::sleep_for(std::chrono::seconds(1));
bridge.cross_bridge("Producer " + std::to_string(i));
}
}
// 消费者:模拟人从西岸去
void consumer(Person& bridge) {
for (int i = 0; i < 5; ++i) {
std::this_thread::sleep_for(std::chrono::seconds(1));
bridge.cross_bridge("Consumer " + std::to_string(i));
}
}
int main() {
Person bridge;
std::thread producer_thread(producer, std::ref(bridge));
std::thread consumer_thread(consumer, std::ref(bridge));
producer_thread.join();
consumer_thread.join();
return 0;
}
```
在这个例子中,我们有一个全局的`bridge_crossed`计数器表示桥上的人数,以及一个布尔标志`bridge_empty`来指示是否可以放行新的行人。当桥上有两个人时(偶数),消费者会等待直到有人通过。
阅读全文