6

私は2つのスレッド間の通信にキューを使用しています(1つはカスタムクラスのインスタンスを生成し、ポインターをキューにプッシュし、もう1つはカスタムクラスのキューポインターから読み取り、いくつかの計算を行います)。キューのプッシュとポップをアトミックにする方法、それらの操作をロックする方法は? (C++11 標準は使用できません)

4

2 に答える 2

9

おそらく最も移植性の高い 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;
};

もう 1 つの利点は、これが C++11std::mutexクラスに非常に似ていることです。代わりにそれを使用することにした場合、変換が非常に簡単になります。

于 2012-07-27T11:15:48.347 に答える
3

擬似コードは次のとおりです。

// Thread A
mutex.lock();
q.push();
mutex.unlock();

// Thread B
mutex.lock();
q.pop();
mutex.unlock();

ブーストを使用している場合は、mutexクラスを試すことができます。

于 2012-07-27T11:05:35.653 に答える