2016-04-28 8 views
3

Visual Studio 2015のstd :: threadの実装は、内部的にPPLのタスクシステムに基づいていますか?Windowsのstd :: threadは内部的にPPLを使用していますか?

私の質問の背景は、それらがすでに共通のスレッドプール上でバランスよく実行されているか、PPLタスクを介してタスクを実行する方が良いため、いくつかのタスクにstd :: threadを使用することは理にかなっていますか?

これは(Which std::async implementations use thread pools?)によると思われますが、質問はかなり古いので、私は "公式"回答を得たいと思います。

+0

これはPPLと同じ基盤を使用します。これは同時実行性ランタイムです。これはOSのプリミティブを(ほぼ)完全に置き換えたもので、多くのコアCPUでスケーラビリティを向上させることに重点を置いていました。そして、私はそれがいつか移植されるという若干のアイドルな希望を疑う。 btwをデバッグすることは大きな喜びではありません。 std :: threadはむしろ裸のクラスなので、PPLを使って追加します。スレッドプールのように、parallel_forなど。 –

答えて

6

YesとNo

std::thread用:
_Thrd_startcthread.cファイル)を呼び出し
std::threadコンストラクタは(threadファイル)
_Launchxthreadファイル)を呼び出し
_Thrd_startXxthreadファイル)を呼び出します
_beginthreadexcthread.cファイル)を呼び出します。

私は_beginthreadexコードを持っていませんが、ファイルatlbase.hに、いくつかのマイクロソフト開発者は、次のコメントを残した:

// _beginthreadex calls CreateThread which will set the last error 
// value before it returns. 


はそう何PPLはinvoledません。

ただし、std::asyncはscensの背後にあるconcurrency::create_taskを呼び出し、Windows APIベースのスレッドプールを使用します。

私の質問の背景は、いくつかのタスクにstd::threadを使用することは理にかなっていますか?

私はPPLを使用するカサブランカを使用しました。私もスタンドアロンとしてPPLで遊んだ。
私はそれをすべて賢明には好きではありません。私自身のスレッドプール+ std::future + std::promiseは、文字通り、concurrency::taskオブジェクトよりも速く驚異的な時間でした。実際には、C#バージョンTPLとの比較では不十分です。私はperformaceがそのプロジェクトのために重要でない場合にのみそれを使用します。

6

From the horse's mouth

我々は 同時実行ランタイム(ConcRT)を使用しないようにSTLのマルチスレッドプリミティブを再実装しました。 ConcRTを使用することは、2012年の の時点で良いアイデアでしたが、それは価値があるよりも問題が多いことが判明しました。私たちが直接

のWindows APIを使用している 今IIRC、PPLもConcRTに基づいていたが、それは標準ライブラリは、PPLの上に構築されたことを意味するものではありません。彼らは横並びに存在していた。 std::threadの下のConcRTをキャプチャするスタックトレースについては、this questionを参照してください。視力のないPPL。

関連する問題