在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
来确保在同一时间只有一个线程可以访问队列。然后,我们创建了两个线程,分别向队列添加元素。最后,我们从队列中获取并打印元素。