In der in VS2010 eingeführten Concurrency-Laufzeit gibt es eine concurrent_queue-Klasse. Es hat eine nicht blockierende Funktion try_pop().
Ähnlich wie in Intel-Thread-Building-Blöcken (TBB) wurde der blocking pop() -Aufruf entfernt, als von Version 2.1 auf 2.2 gewechselt wurde.Warum ist die concurrent_queue nicht blockierend?
Ich frage mich, was das Problem mit einem blockierenden Anruf ist. Warum wurde es von TBB entfernt? Und warum gibt es keine gleichzeitige Warteschlange?
Ich bin in einer Situation, in der ich eine blockierende gleichzeitige Warteschlange benötigen, und ich möchte nicht beschäftigt warten. Abgesehen davon, dass ich selbst eine Queue schreibe, gibt es noch eine andere Möglichkeit in der Laufzeitumgebung?
Mit einer Blockierung 'pop', können Sie * implementieren *„klassischen Erzeuger-Verbraucher“mit TBB in etwa zwei Codezeilen, ohne dass irgendwelche Synchronisierungsgrund selbst zu schreiben. (Der Konsument tut 'while (true) konsumiert (Q.pop());' und der Produzent tut 'while (true) Q.push (produce());'.) Ohne ein blockierendes 'pop', das gleiche Problem erfordert mindestens doppelt so viel Code: nämlich Buchhaltung eine zusätzliche Zustandsvariable pro Warteschlange. Aber wie paxdiablo sagt, 'tbb :: concurrent_bounded_queue' liefert weiterhin die blockierende' pop'-Funktionalität und ist im Grunde ein Ersatz für 'concurrent_queue'. – Quuxplusone