在C++中,std::priority_queue
不是线程安全的
以下是一个使用 std::priority_queue
和 std::mutex
的示例:
#include
#include
#include
#include
#include
class ThreadSafePriorityQueue {
public:
void push(int value) {
std::unique_lock lock(mutex_);
queue_.push(value);
}
bool pop(int& value) {
std::unique_lock lock(mutex_);
if (queue_.empty()) {
return false;
}
value = https://www.yisu.com/ask/queue_.top();> 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
来确保在同一时间只有一个线程可以访问队列。然后,我们创建了两个线程,分别向队列添加元素。最后,我们从队列中获取并打印元素。