阅读量:0
在多线程环境中,为了安全地使用 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
中。然后,我们等待所有线程完成,并从优先队列中获取并打印元素。