2017-01-30 2 views
4

質問をより詳しく説明する前に、回答は実装に依存していることに注意してください。私は主にlibstdC++について尋ねていますが、libC++についても聞きたいと思います。オペレーティングシステムはLinuxです。 std::promisestd::packaged_task、又はstd::asyn機能のいずれかを - 結果は、非同期操作により設定されるまでstd :: futureスピンウェイトはありますか?

std::futureブロックにwait()又はget()を呼び出します。結果の可用性は、共有状態によって伝達されます。これは基本的に原子的変数です。将来は、共有状態が約束(または非同期タスク)によって準備ができているとマークされるのを待ちます。この待機および通知は、futexシステムコールを介してlibstdC++で実装されています。フューテックスの性能が高いことを前提に、将来が非常に短い期間(1マイクロ秒のオーダ)だけ待つことが予想される状況では、短時間の間共有状態を回転させることによってパフォーマンスを向上させることができますフューテックスを待つ前に

私はしかし、私は、このようなスピンを見つけることを期待する atomic_futex.h at line 161にコメントを見つけた、現在の実装では、このような回転のいずれかの証拠を発見していない

// TODO Spin-wait first. 

だから私の質問ではなく、次のさ:実際にスピンウェイトを実装する計画はありますか?もしそうなら、どのように期間を決めるのですか?さらに、これは、今後のポリシーを通じて最終的に指定できる機能の種類ですか?

+0

実装の詳細です。それは、Linux上でmutexシステムコールが実際にフューテックスなので、Linuxでは関係ありませんと私は思う、 – AndyG

+0

(それは、 。 – SergeyA

+0

@ SergeyAまだ、futex呼び出しには数マイクロ秒かかりますが、回転は数ナノ秒にすぎません。私はそれが非常に特定のユースケースの最適化であることを認識しています。 –

答えて

3

私は質問に答えます:std::future::get()はスピンウェイトを実行しますか?

C++のすべての答えは次のとおりです。実装の詳細です。準拠している標準ライブラリが回転することもあれば、回転しないこともあります(同じことをstd::mutex::lock()で可能です)。将来スピンするかどうか、どのようにスピンするかを指定する仕組みはありますか?見える場所は、管理のための先進的な機能を備えたパフォーマンス重視のライブラリhpx::future()、(すぐにスタンダードライブラリのフルバージョンに近づいています)です。これらのどれも、紡績の明示的な仕組みを持っていないし、ISO CPPメーリングリストでも知っている会議議事録で議論されていない。 get_with_spins関数のようなものがパイプラインにないと言うのは安全です。

libstdc++(およびlibc++)については、次のように答えてください:これらはまた回転しません。 the original patchから来たTODOを除いて、これを変更する予定はないようです。私はGCCのメーリングリストを検索して、この動作の変更の言及を探しましたが、何も見つかりませんでした。一般的なケースでは、スリープ前のスピンを行うと痛いことがあります(get()に値がない場合、CPUサイクルが浪費されています)ので、ここでの変更は悪影響を及ぼす可能性があります。

要約すると、実装は現在スピンしておらず、近い将来に動作を変更する予定はないようですが、それはいつでも変更できます。

関連する問題