c++ priority_queue在多线程环境中的使用

avatar
作者
猴君
阅读量:0

在C++中,std::priority_queue 不是线程安全的

以下是一个使用 std::priority_queuestd::mutex 的示例:

#include<iostream> #include<queue> #include<thread> #include <mutex> #include<vector>  class ThreadSafePriorityQueue { public:     void push(int value) {         std::unique_lock<std::mutex> lock(mutex_);         queue_.push(value);     }      bool pop(int& value) {         std::unique_lock<std::mutex> lock(mutex_);         if (queue_.empty()) {             return false;         }         value = queue_.top();         queue_.pop();         return true;     }  private:     std::priority_queue<int> queue_;     std::mutex mutex_; };  void worker(ThreadSafePriorityQueue& queue, int start, int end) {     for (int i = start; i <= end; ++i) {         queue.push(i);     } }  int main() {     ThreadSafePriorityQueue queue;      // 创建两个线程向队列添加元素     std::thread t1(worker, std::ref(queue), 1, 50);     std::thread t2(worker, std::ref(queue), 51, 100);      // 等待线程完成     t1.join();     t2.join();      // 从队列中获取并打印元素     int value;     while (queue.pop(value)) {         std::cout<< value << " ";     }     std::cout<< std::endl;      return 0; } 

这个示例中,我们创建了一个名为 ThreadSafePriorityQueue 的类,它包装了 std::priority_queue 并提供了线程安全的 pushpop 方法。我们使用 std::mutex 来确保在同一时间只有一个线程可以访问队列。然后,我们创建了两个线程,分别向队列添加元素。最后,我们从队列中获取并打印元素。

广告一刻

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