在多线程环境中,为了安全地使用 priority_queue,您需要确保在对 priority_queue 进行访问和修改时使用同步机制
#include<iostream>
#include<queue>
#include <mutex>
#include<thread>
#include<vector>
class SafePriorityQueue {
public:
void push(int value) {
std::unique_lock<std::mutex> lock(mtx);
pq.push(value);
}
bool pop(int& value) {
std::unique_lock<std::mutex> lock(mtx);
if (pq.empty()) {
return false;
}
value = pq.top();
pq.pop();
return true;
}
private:
std::priority_queue<int> pq;
std::mutex mtx;
};
void worker(SafePriorityQueue& spq, int start, int end) {
for (int i = start; i <= end; ++i) {
spq.push(i);
}
}
int main() {
SafePriorityQueue spq;
// 创建并启动多个线程向优先队列添加元素
std::vector<std::thread> threads;
threads.emplace_back(worker, std::ref(spq), 1, 100);
threads.emplace_back(worker, std::ref(spq), 101, 200);
threads.emplace_back(worker, std::ref(spq), 201, 300);
// 等待所有线程完成
for (auto& t : threads) {
t.join();
}
// 从优先队列中获取并打印元素
int value;
while (spq.pop(value)) {
std::cout<< value << " ";
}
std::cout<< std::endl;
return 0;
}
这个示例中,我们创建了一个名为 SafePriorityQueue
的类,它包装了一个 std::priority_queue
并提供了用于操作优先队列的线程安全方法。push()
和 pop()
方法使用 std::mutex
来确保在多线程环境中对优先队列的访问是安全的。
在 main()
函数中,我们创建了三个线程,每个线程将一系列整数添加到 SafePriorityQueue
中。然后,我们等待所有线程完成,并从优先队列中获取并打印元素。