用c++写用记录型信号量描述过独木桥问题
时间: 2024-10-10 07:04:37 浏览: 12
在C++中,我们可以使用互斥量(mutex)和条件变量(condition_variable)来模拟“过独木桥”问题,这通常涉及到资源的顺序访问和同步。记录型信号量是一种特殊的信号量,它允许我们跟踪等待该信号量的线程数量。
以下是使用记录型信号量(通过`std::semaphore`)描述独木桥问题的一个简单示例:
```cpp
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
#include <condition_variable>
// 独木桥模型
const int MAX_PEOPLE = 2; // 桥上最多只能有两个人
class Bridge {
public:
std::mutex mtx;
std::condition_variable cv;
int people_on_bridge = 0;
void cross(int id) {
std::unique_lock<std::mutex> lock(mtx);
while (people_on_bridge == MAX_PEOPLE) {
std::cout << "Person " << id << ", waiting for the bridge to be empty...\n";
cv.wait(lock); // 当桥上有人时,等待
}
people_on_bridge++;
std::cout << "Person " << id << " is crossing the bridge.\n";
// 假设过桥时间随机
std::this_thread::sleep_for(std::chrono::seconds(2 + id % 5));
lock.unlock();
cv.notify_one(); // 当人离开桥时,通知其他等待者
people_on_bridge--;
}
};
int main() {
Bridge bridge;
std::vector<std::thread> threads;
threads.push_back(std::thread(&Bridge::cross, &bridge, 1));
threads.push_back(std::thread(&Bridge::cross, &bridge, 2));
threads.push_back(std::thread(&Bridge::cross, &bridge, 3));
for (auto& t : threads) {
t.join();
}
return 0;
}