condition_variable cv;
mutex mut;
// Thread 1:
void run() {
while (true) {
mut.lock();
// create_some_data();
mut.unlock();
cv.notify_all();
}
}
// Thread 2
void thread2() {
mutex lockMutex;
unique_lock<mutex> lock(lockMutex);
while (running) {
cv.wait(lock);
mut.lock();
// copy data
mut.unlock();
// process data
}
}
// Thread 3, 4... - same as Thread 2
は、私は、スレッド1、新たなデータを取得するためにすべての時間を実行します。他のスレッドは、新しいデータが利用できるようになるまでcondition_variableで待機し、それをコピーして処理します。スレッドによって完成された作業は、完了に必要な時間が異なります。スレッドは、古いもので終了したときにのみ新しいデータを取得するという考え方です。その間に取得されたデータは「欠落」することができます。私はスレッドをお互いに依存させたくないので、共有ミューテックス(データにアクセスするためだけ)を使用しません。
上記のコードはUbuntu上で動作しますが、notify_all()が呼び出されたときにただ1つのスレッドのみが通知されていて、wait()でハングするだけです。 なぜですか? Linuxではcondition_variableを使用するために異なるアプローチが必要ですか?
'私はスレッドをお互いに依存させたくないので、共有ミューテックス(データにアクセスするためだけ)を使用しません。 ' - しかし、条件変数**を使うには**共有ミューテックスが必要です。他に方法はありません。 – Tsyvarev