私はC++11の同時実行性について学んでいます。同時実行性プリミティブに関する私の唯一の以前の経験は、6年前のオペレーティングシステムクラスでした。できれば、穏やかにしてください。
C ++ 11では、次のように書くことができます
std::mutex m;
std::condition_variable cv;
std::queue<int> q;
void producer_thread() {
std::unique_lock<std::mutex> lock(m);
q.push(42);
cv.notify_one();
}
void consumer_thread() {
std::unique_lock<std::mutex> lock(m);
while (q.empty()) {
cv.wait(lock);
}
q.pop();
}
cv.wait
これは問題なく機能しますが、ループでラップする必要があることに腹を立てています。ループが必要な理由は私には明らかです。
Consumer (inside wait()) Producer Vulture
release the lock
sleep until notified
acquire the lock
I MADE YOU A COOKIE
notify Consumer
release the lock
acquire the lock
NOM NOM NOM
release the lock
acquire the lock
return from wait()
HEY WHERE'S MY COOKIE I EATED IT
さて、私unique_lock
はそれについてのクールなことの1つは、私たちがそれを回すことができるということだと思いますよね?したがって、代わりにこれを行うことができれば、本当にエレガントになります。
Consumer (inside wait()) Producer
release the lock
sleep until notified
acquire the lock
I MADE YOU A COOKIE
notify and yield(passing the lock)
wake(receiving the lock)
return from wait()
YUM
release the lock
ミューテックスはからI MADE YOU A COOKIE
までずっとロックされたままなので、Vultureスレッドが急降下する方法はありませんYUM
。さらに、notify()
ロックを渡す必要がある場合は、呼び出す前に実際にミューテックスをロックすることを確認するのに適した方法です(条件変数(pthread)のシグナリングnotify()
を参照)。
C++11にはこのイディオムの標準的な実装がないことは間違いありません。その歴史的な理由は何ですか(pthreadがそれをしなかったというだけですか?そしてそれはなぜですか)?冒険的なC++コーダーがこのイディオムを標準のC++11で実装できなかったという技術的な理由はありmy_better_condition_variable
ますか?
また、セマフォを作り直しているのではないかと漠然と感じていますが、それが正しいかどうかを学校で十分に覚えていません。