在多線程環境中,為了安全地使用 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
中。然后,我們等待所有線程完成,并從優先隊列中獲取并打印元素。