在多线程环境中如何安全地使用priorityqueue

   2024-09-30 5240
核心提示:在多线程环境中,为了安全地使用 priority_queue,您需要确保在对 priority_queue 进行访问和修改时使用同步机制#includeiostrea

在多线程环境中,为了安全地使用 priority_queue,您需要确保在对 priority_queue 进行访问和修改时使用同步机制

#include<iostream>#include<queue>#include <mutex>#include<thread>#include<vector>class SafePriorityQueue {public:    void push(int value) {        std::unique_lock<std::mutex> lock(mtx);        pq.push(value);    }    bool pop(int& value) {        std::unique_lock<std::mutex> lock(mtx);        if (pq.empty()) {            return false;        }        value = pq.top();        pq.pop();        return true;    }private:    std::priority_queue<int> pq;    std::mutex mtx;};void worker(SafePriorityQueue& spq, int start, int end) {    for (int i = start; i <= end; ++i) {        spq.push(i);    }}int main() {    SafePriorityQueue spq;    // 创建并启动多个线程向优先队列添加元素    std::vector<std::thread> threads;    threads.emplace_back(worker, std::ref(spq), 1, 100);    threads.emplace_back(worker, std::ref(spq), 101, 200);    threads.emplace_back(worker, std::ref(spq), 201, 300);    // 等待所有线程完成    for (auto& t : threads) {        t.join();    }    // 从优先队列中获取并打印元素    int value;    while (spq.pop(value)) {        std::cout<< value << " ";    }    std::cout<< std::endl;    return 0;}

这个示例中,我们创建了一个名为 SafePriorityQueue 的类,它包装了一个 std::priority_queue 并提供了用于操作优先队列的线程安全方法。push()pop() 方法使用 std::mutex 来确保在多线程环境中对优先队列的访问是安全的。

main() 函数中,我们创建了三个线程,每个线程将一系列整数添加到 SafePriorityQueue 中。然后,我们等待所有线程完成,并从优先队列中获取并打印元素。

 
举报打赏
 
更多>同类维修大全
推荐图文
推荐维修大全
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号