温馨提示×

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

c++
小樊
82
2024-09-04 19:13:12
栏目: 编程语言

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

0