C++11マルチスレッドプログラミング--スレッドセキュリティキュー

2114 ワード

1 std::threadクラスのコンストラクション関数は、可変パラメータテンプレートを用いて実現される.すなわち、任意のパラメータを渡すことができ、最初のパラメータはスレッドのエントリ関数(呼び出し可能オブジェクト)であり、後のいくつかのパラメータはその関数のパラメータである.2 std::mutexロック(lock)とアンロック(unlock)の2つの操作があります.3 std::lock_guardクラスのコンストラクション関数でリソースを作成し、コンストラクション関数でリソースを解放します.異常が発生してもc++クラスのコンストラクション関数が実行できることを保証します.4 std::unique_lock提供されたlock()unlock()インターフェースは、現在施錠されているか施錠されていないかを記録することができ、使用可能std::defer_lock初期化時にデフォルトの施錠操作を行わない設定ができます.lock_guard unique_lock : unique_lockより柔軟ですが、効率はlock_guardより低いです.内部にロックが必要な状態なのでlock_guard問題が解決できる場合はlock_guard、逆にunique_lockを使います.5 std::condition_variable2つの重要なインターフェースがあるnotify_one()wait()wait()スレッドをスリープ状態にすることができるnotify_one()起動waitのいずれかの条件変数.
スレッドの安全なキュー:
#pragma once
#include 
#include 
#include 
#include 
#include 

template
class ThreadsafeQueue {
public:
    ThreadsafeQueue() { }
    ~ThreadsafeQueue() { }
    void push(T new_value) {
        mu_.lock();
        queue_.push(std::move(new_value));
        mu_.unlock();
        cond_.notify_all();
    }
    int32_t wait_and_pop(T& value, int64_t timeout_ms = -1) {
        std::unique_lock<:mutex> lk(mu_);
        if (timeout_ms <= -1) {
            cond_.wait(lk, [this]{return !queue_.empty();});
            value = std::move(queue_.front());
            queue_.pop();
            return 0;
        } else {
            if (!cond_.wait_for(lk, std::chrono::milliseconds(timeout_ms), [this]{return !queue_.empty();})) {
                return -1;
            }
            value = std::move(queue_.front());
            queue_.pop();
            return 0;
        }
    }
private:
    mutable std::mutex mu_;
    std::queue queue_;
    std::condition_variable cond_;
};