C++11マルチスレッドプログラミング--スレッドセキュリティキュー
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_variable
2つの重要なインターフェースがある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_;
};