C ++でのタスクベースのプログラミングには、新しい言語標準機能が必要ですか?


8

だから私はGoingNative 2012:誰もが質問できるインタラクティブパネルでこれらすべてのC ++マスターと共にYoutubeでこのビデオを見ました。

これは私が話していたビデオです:GoingNative 2012-1日目-インタラクティブパネル:ネイティブであることの重要性

そして時間0:24:00に誰かが非常に興味深い質問をしました:

私たちはしばらくの間、pthreadを使用したり、Windowsスレッドを使用したりして並行プログラミングを行ってきました。C++とCが並行プログラミングに追いついてうれしいですが、すでに5年または10年遅れているように思えます何年もの間、現在、これらの強力なマルチコアがすべてあり、これらのマルチコアのプログラミングはスレッドに基づくべきではなく、タスクベースである必要があり[...]、MicrosoftにはPPLライブラリなどがあり、これは完全にC ++標準には反映されていません。[...]私が恐れている唯一のことは、標準がスレッドにロックされ、タスクベースのプログラミングに移行するのが非常に困難になることです...

今、私はこれらの概念にかなり慣れていないので、少し混乱しています。実際にタスクベースのプログラミングとは何ですか。この用語は、ロックフリープログラミングと同じ意味ですか?これらの2つの同等の用語ですか、それらの間にリンクはありますか?


1
私は最新のC ++標準で作業する機会がなかったので、これは途方に暮れるかもしれませんが、あなたの見積もりの​​懸念と一致しています。私の語彙では、タスクはプロセスに相当します。プロセス/タスクには独自のメモリが割り当てられています。異なるプロセスが別のプロセスのメモリ/データにアクセスすることはできません(少なくともフープを飛び越えない限り)。スレッドは、同じプロセスで実行されている他のスレッドのメモリ/データにアクセスできます。したがって、マルチコアシステムでは、プロセスは別のCPUで問題なく実行できますが、共有データ/メモリにアクセスする場合、スレッドは互いに調整する必要があります。
2013年

1
...それにより、スレッドが異なるCPUで実行されている場合、マルチコアシステムのフープをジャンプする必要が生じます。これは、ループ内のプログラマを処理するのに十分なほど難しく、ハードウェア/コンパイラが一般的なケースを確実かつ効率的に処理できるかどうかは疑問です。
ダンク

これらすべての素晴らしい答えをありがとうございましたが、まだ答えられていない質問がありDoes this term refer to the same thing that Lock-Free Programming refers to? Are these two equivalent terms or are there any links between them?ます:誰かが説明できますか?これらのタスクベースのライブラリはすべてスレッドの上に構築されていますか、それとも他の方法で実装されていますか?ありがとう!

回答:


4

Microsoftには「タスク並列ライブラリ」またはTPLがあります。

TPLはすでにスレッドベースであり、スレッドの特別な機能に依存していないため、これはスレッドよりも高いレベルの抽象化であり、ライブラリベースです。その実現のための言語の標準(キーワードただしasyncawait簡単にそのようなプログラミングを行うためにC#コンパイラに追加されました)。

A タスクマイクロソフトecostructureでは、多かれ少なかれ同等であるフューチャーまたは約束。基本的に、これは非ブロッキング(非同期)関数です。これを呼び出すと、新しいスレッドで実行されている間、制御が戻ります。その後、戻り値が利用可能になったときに、戻り値を取得します。

TPLには、などのその他の機能がありParallel.For、複数のスレッドを使用してループを同時に処理できます。これらはすべて、C ++でライブラリ関数として実装できます。実際、そのようなライブラリはすでに作成されいます

私の知る限り、PPL(Microsoft C ++の並列パターンライブラリ)は、特別な言語機能に依存していません。


a Taskとaの重要な違いの1つThreadは、タスクが必ずしも別のスレッドで実行されている関数を表すとは限らないことです。これは、現在のスレッドで実行されていないときに、終了または値を生成する可能性のあるものを表します。CPUにバインドされた作業を表していない場合は、スレッドがまったく実行されていないことが原因である可能性があります。おそらく最も一般的な例は非同期IOです。関数が別のスレッドでいつ終了するかを表すものではありません。特定のOSフックがいつ起動するかを表します。 Taskどのように完了するかを気にせず、「非同期操作」として扱うことができます。
サービー2013年

コメントで良い例を実際に示すことはできません... grr。私の古い質問を見つけることができるかどうかを確認します...
サービー

1
@Servy:そうです。非同期操作の完了は、何らかの外部イベントに応答するメソッドコールバックの結果である可能性があります。
ロバートハーベイ

はい、それは一例です。を使用して何かを設定するのは一般に簡単TaskCompletionSourceです。つまり、タスクを作成して実行を継続すると、そのスレッドは最終的にTCSの結果を設定することになるため、複数のスレッドを実行する必要なくタスクをすべて完了できます。
サービー2013年

0

cppには、年齢を問わず、threads-via-blocksライブラリがあります。非常に優れたIntelのスレッドビルディングブロックがあり、OpenMPのような類似の機能があります。これにより、「システムに自動的に実行させる」という方法でスレッドを抽象化できます(これはVC ++でサポートされているため、/を設定する必要があります。ビルドのopenmpフラグ)

マイクロソフトは、カサブランカにも取り組んでいます。これは、真に汎用的なタスクライブラリではないかもしれませんが、Erlangのアクターモデルに似たものを使用して、タスクベースのシステム(主にWebアプリの目的)を作成するためのフレームワークです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.