在多线程环境中如何安全地使用priorityqueue

avatar
作者
猴君
阅读量: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 中。然后,我们等待所有线程完成,并从优先队列中获取并打印元素。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!