温馨提示×

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

小樊
82
2024-09-03 01:32:13
栏目: 编程语言

在多线程环境中,为了安全地使用 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 中。然后,我们等待所有线程完成,并从优先队列中获取并打印元素。

0