利用二值信号量做停车场代码
时间: 2024-02-12 13:09:25 浏览: 17
以下是一个基于二值信号量控制停车场的示例代码(使用C++11标准):
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
const int MAX_PARKING_SPOTS = 10; // 最大停车位数量
int parkingSpots = MAX_PARKING_SPOTS; // 当前停车位数量
std::mutex mtx; // 互斥锁,保证线程安全
std::condition_variable cvEntrance, cvExit; // 入口和出口条件变量
bool isEntranceOpen = true, isExitOpen = true; // 初始状态下入口和出口都是开放的
void enterParkingLot() {
std::unique_lock<std::mutex> lock(mtx);
// 如果停车场已满,则等待入口条件变量
while (parkingSpots == 0) {
cvEntrance.wait(lock);
}
// 停车位数量减一
parkingSpots--;
std::cout << "车辆进入停车场,当前停车位数量为:" << parkingSpots << std::endl;
// 如果当前停车位数量为0,则关闭入口
if (parkingSpots == 0) {
isEntranceOpen = false;
}
}
void exitParkingLot() {
std::unique_lock<std::mutex> lock(mtx);
// 停车位数量加一
parkingSpots++;
std::cout << "车辆离开停车场,当前停车位数量为:" << parkingSpots << std::endl;
// 如果当前停车位数量为最大值,则开放入口
if (parkingSpots == MAX_PARKING_SPOTS) {
isEntranceOpen = true;
cvEntrance.notify_all(); // 通知等待入口条件变量的线程
}
// 开放出口
isExitOpen = true;
cvExit.notify_all(); // 通知等待出口条件变量的线程
}
void carThread(int id) {
std::cout << "车辆" << id << "即将进入停车场" << std::endl;
enterParkingLot(); // 进入停车场
// 停留一段时间后离开停车场
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "车辆" << id << "即将离开停车场" << std::endl;
// 如果出口已关闭,则等待出口条件变量
std::unique_lock<std::mutex> lock(mtx);
while (!isExitOpen) {
cvExit.wait(lock);
}
// 关闭出口
isExitOpen = false;
exitParkingLot(); // 离开停车场
}
int main() {
std::cout << "停车场开放,最大停车位数量为:" << MAX_PARKING_SPOTS << std::endl;
// 创建多个线程模拟多个车辆进入和离开停车场
std::thread car1(carThread, 1);
std::thread car2(carThread, 2);
std::thread car3(carThread, 3);
std::thread car4(carThread, 4);
std::thread car5(carThread, 5);
// 等待所有线程执行完毕
car1.join();
car2.join();
car3.join();
car4.join();
car5.join();
std::cout << "所有车辆已离开停车场,停车场关闭" << std::endl;
return 0;
}
```
在该示例代码中,使用了`std::mutex`和`std::condition_variable`实现了互斥锁和条件变量,实现了多个线程模拟多个车辆进入和离开停车场。