簡體   English   中英

如何在隊列原子上進行推送和彈出,如何鎖定這些操作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM