从A到B,100张车票,10个窗口售卖,一个窗口一条线程,票卖完之后窗口结束,代码实现C++
时间: 2024-10-14 20:09:15 浏览: 20
在C++中,你可以使用线程池、互斥量或条件变量来模拟这样的售票场景。这里是一个简单的线程安全实现示例:
```cpp
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
std::vector<int> tickets(100); // 初始化所有票
int total_tickets = 100;
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
bool sold_out = false; // 票是否售罄标志
void sell_tickets(int window_index) {
for (int i = 0; i < total_tickets && !sold_out; ++i) {
std::lock_guard<std::mutex> lock(mtx);
if (!tickets[i]) { // 如果该窗口还有票
std::cout << "Window " << window_index << ": Ticket sold! (" << i + 1 << "/" << total_tickets << ")\n";
tickets[i] = 0; // 出售
} else {
cv.wait(lock, []{ return tickets[i]; }); // 等待直到有票
}
}
std::cout << "Window " << window_index << " closed.\n";
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
threads.push_back(std::thread(sell_tickets, i));
}
for (auto& thread : threads) {
thread.join();
}
sold_out = true; // 假设所有窗口都已关闭
cv.notify_all(); // 醒醒大家,票已经全部售完
return 0;
}
```
在这个例子中,我们创建了10个窗口线程,每个线程负责一个窗口的售票。`sell_tickets`函数通过互斥锁保证了对`tickets`数组的原子操作,并使用条件变量`cv`来同步各个线程,当某个窗口的票售完时,会通知其他等待的线程。
阅读全文