阅读量:0
在C++中,std::priority_queue
不是线程安全的
以下是一个使用 std::priority_queue
和 std::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
并提供了线程安全的 push
和 pop
方法。我们使用 std::mutex
来确保在同一时间只有一个线程可以访问队列。然后,我们创建了两个线程,分别向队列添加元素。最后,我们从队列中获取并打印元素。