[英]How to make push and pop on queue atomic, how to lock those operations?
我正在使用隊列進行兩個線程之間的通信(一個只生成自定義類的實例並將指針推送到隊列,另一個從自定義類的隊列指針讀取並進行一些計算)。 如何在隊列原子上進行推送和彈出,如何鎖定那些操作?(我不能使用C ++ 11標准)
可移植性最強的非C ++ 11鎖定機制可能是Boost.Thread庫中的同步類型。 特別是, mutex類為您提供了一個簡單的可鎖定對象,用於提供對資源的獨占訪問。 例如:
#include <boost/thread/mutex.hpp>
#include <queue>
template <typename T>
class locking_queue {
public:
void push(T const & value) {
boost::mutex::scoped_lock lock(mutex);
queue.push(value);
}
bool pop(T & value) {
boost::mutex::scoped_lock lock(mutex);
if (queue.empty()) {
return false;
} else {
value = queue.front();
queue.pop();
return true;
}
}
private:
std::queue<T> queue;
boost::mutex mutex;
};
另一個優點是,這與C ++ 11 std::mutex
類非常相似,如果您決定使用它,這將使轉換變得非常簡單。
這是一個偽代碼:
// Thread A
mutex.lock();
q.push();
mutex.unlock();
// Thread B
mutex.lock();
q.pop();
mutex.unlock();
如果你正在使用boost,你可以試試它的互斥類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.