条件変数
以下のコードは、スレッド間でのイベント処理のサンプルです。
// 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 スレッドが過度のスリープ状態にならないようにします。