Ich lerne über C++ 11 Nebenläufigkeit, wo meine einzige vorherige Erfahrung mit Parallelen Primitiven in der Betriebssystemklasse vor sechs Jahren war, also sei sanft, wenn du kannst.C++ 11 std :: condition_variable: Können wir unsere Sperre direkt an den notifizierten Thread übergeben?
In C++ 11, können wir
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();
}
Dies funktioniert gut schreiben, aber ich bin von der Notwendigkeit beleidigt cv.wait
in einer Schleife zu wickeln. Der Grund, warum wir die Schleife müssen, ist mir klar:
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
Nun, ich glaube, eine der coolen Dinge über unique_lock
ist, dass wir es um passieren kann, nicht wahr? So wäre es wirklich elegant sein, wenn wir diese stattdessen tun könnten:
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
Jetzt gibt es keine Möglichkeit für den Geier Thread Schlag in, weil der Mutex der ganzen Weg I MADE YOU A COOKIE
-YUM
gesperrt bleibt. Plus, wenn notify()
erfordert, dass Sie eine Sperre übergeben, ist das ein guter Weg, um sicherzustellen, dass Menschen den Mutex tatsächlich vor dem Aufruf (siehe Signalling a condition variable (pthreads)) sperren.
Ich bin mir ziemlich sicher, dass C++ 11 keine Standardimplementierung dieses Idioms hat. Was ist der historische Grund dafür (ist es nur, dass Pthreads es nicht getan hat? Und warum ist das)? Gibt es einen technischen Grund, dass ein abenteuerlustiger C++ - Coder dieses Idiom nicht in Standard C++ 11 implementieren konnte und es vielleicht my_better_condition_variable
nannte?
Ich habe auch ein vages Gefühl, dass ich vielleicht Semaphoren neu erfinde, aber ich erinnere mich nicht genug von der Schule, um zu wissen, ob das genau ist oder nicht.
Erm, wenn Sie das Cookie nicht essen einige Thread wollen Warum läufst du überhaupt? –
Guter Punkt, der Ton meiner Frage war etwas voreingenommen gegen Geier. :) Siehe, Verbraucher hat einen schönen Traum. Er ist bereit, für Kekse und Milch geweckt zu werden, aber wenn er aufwacht und * keine * Kekse findet, wird er aufgebracht sein. Es ist also in Ordnung, wenn Producer Cookies an Vulture übermittelt, aber es ist nicht in Ordnung für Producer, den Consumer zu wecken, indem er ihn schüttelt und "COOKIE TIME!" Ruft. und dann "Oh, hoppla, Geier hat deinen Keks gegessen, während ich dich geschüttelt habe." Das ist nicht cool, Produzent. Das ist nicht cool. – Quuxplusone
Das macht keinen Sinn. Sie können nicht mehrere nicht verwandte Threads erwarten, die nicht wissen, dass die anderen Threads, die auf dieselben freigegebenen Daten zugreifen, ordnungsgemäß funktionieren. Wie würde Vulture jemals mit Ihrer vorgeschlagenen Lösung Kekse essen? –