Bevor ich die Frage ausführlicher erläutere, werde ich feststellen, dass die Antwort offensichtlich implementierungsabhängig ist, also frage ich in erster Linie nach libstdC++, würde mich aber auch über libC++ informieren. Das Betriebssystem ist Linux.Ist std :: future spin-wait?
Aufruf wait()
oder get()
auf einem std::future
blockiert, bis das Ergebnis von einem asynchronen Betrieb gesetzt ist - entweder eine std::promise
, std::packaged_task
oder std::asyn
Funktion. Die Verfügbarkeit des Ergebnisses wird über einen gemeinsamen Status mitgeteilt, der im Grunde eine atomare Variable ist: Der future wartet darauf, dass der gemeinsam genutzte Status vom Versprechen (oder asynchronen Task) als bereit markiert wird. Dieses Warten und Benachrichtigen wird in libstdC++ über einen Systemaufruf futex implementiert. Zugegeben, dass Futexs hochperformant sind, in Situationen, in denen eine Zukunft nur eine extrem kurze Zeit (in der Größenordnung von Mikrosekunden) erwartet, würde es scheinen, dass ein Leistungsgewinn durch kurzzeitiges Drehen im gemeinsamen Zustand erreicht werden könnte bevor Sie auf den Futex warten.
ich keine Beweise für eine solche Spinnen in der aktuellen Implementierung gefunden haben, aber ich einen Kommentar in atomic_futex.h at line 161 gefunden, wo ich erwartet, wie Spinnen zu finden wäre:
eher die folgenden// TODO Spin-wait first.
So ist meine Frage : Gibt es wirklich Pläne, ein Spin-Wait zu implementieren, und wenn ja, wie wird die Dauer entschieden? Gibt es darüber hinaus die Art von Funktionalität, die eventuell durch eine zukünftige Richtlinie spezifiziert werden könnte?
Es ist ein Implementierungsdetail. Es könnte eine kleine Warteoptimierung sein, um auf einige Versuche zu warten, und dann tatsächlich warten (von der CPU genommen werden) – AndyG
Ich denke, es ist unter Linux nicht relevant, da der Mutex Systemaufruf unter Linux eigentlich ein Futex ist . – SergeyA
@SergeyA Dennoch kann ein Futex-Aufruf mehrere Mikros dauern, während das Spinnen nur einige Nanos sein kann. Mir ist klar, dass es sich um eine Optimierung für einen sehr speziellen Anwendungsfall handelt. –