条件変数
以下のコードは、スレッド間でのイベント処理のサンプルです。
// condition_variable.cpp #include <chrono> #include <condition_variable> #include <iostream> #include <mutex> #include <queue> #include <thread> using namespace std; mutex m; condition_variable cond; queue<int> produced; bool done = false; void produce() { for(int i = 0; i < 5; i++) { this_thread::sleep_for(chrono::seconds(1)); unique_lock<mutex> l(m); cout << "producing " << i << endl << flush; produced.push(i); cond.notify_all(); } done = true; cond.notify_all(); } void consume() { unique_lock<mutex> l(m); while(!done) { cond.wait(l); while(!produced.empty()) { cout << "consuming " << produced.front() << endl << flush; produced.pop(); } } } int main(int, char *[]) { thread producer(produce), consumer(consume); producer.join(); consumer.join(); return 0; }
producer スレッドは、一秒ごとにキューへ値をプッシュします。consumer スレッドは、値がプッシュされると、wait() で停止していた状態から、notify_all() の実行によって再開されます。これを使って、consumer スレッドが過度のスリープ状態にならないようにします。