8

最近、.NET での並列プログラミングについて多くのことを読みましたが、この主題に関するテキストと矛盾するステートメントにいまだに混乱しています。

たとえば、stackoverflow.com task-parallel-library タグのポップアップ (タグのアイコンにマウスを合わせると) の説明:

「Task Parallel Library は .NET 4 の一部です。開発者がマルチコア共有メモリ プロセッサをプログラムできるようにする一連の API です。」

これは、以前のバージョンの .NET を使用してマルチコア d および並列プログラミング アプリケーションを作成できないということですか?

.NET マルチスレッド アプリケーションのコア間のマルチコア/並列使用/分配を制御しますか?

スレッドを実行するコアを特定し、スレッドを特定のコアに関連付けるにはどうすればよいですか?

以前のバージョンの .NET では実行できなかっ た.NET 4.0 以降のタスク並列ライブラリでは何が可能になりましたか?

更新:
特定の質問を作成するのは困難でしたが、よりよく理解したいと思います:

マルチスレッド アプリケーションの開発と並列プログラミングの .NET における違いは何ですか?

これまでのところ、私はそれらの違いを把握できませんでした

Update2:
MSDNの「.NET Framework での並列プログラミング」はバージョン .NET 4.0 から始まり、その記事Task Parallel Libraryは次 のように述べています。

「.NET Framework 4 以降では、TPL はマルチスレッドおよび並列コードを記述するための推奨される方法です」

マルチスレッド開発に精通していることを考慮して、.NET4 以前 (.NET3.5) で具体的に並列コードを作成する方法のヒントを教えてください。

4

5 に答える 5

14

私は「マルチスレッド」を、まさにその言葉のとおり、つまり複数のスレッドを使用するものと考えています。

「並列処理」とは、作業のグループを複数のスレッドに分割して、作業を並行して処理できるようにすることです。

したがって、並列処理はマルチスレッドの特殊なケースです。


これは、以前のバージョンの .NET を使用してマルチコア d および並列プログラミング アプリケーションを作成できないということですか?

全くない。Threadクラスを使用してそれを行うことができます。書くのがずっと難しかったし、それを正しくするのもずっと難しかった。

.NET マルチスレッド アプリケーションのコア間のマルチコア/並列使用/分配を制御しますか?

そうではありませんが、その必要はありませ。アプリケーションのプロセッサ アフィニティをいじることはできますが、.NET レベルでは、これが勝利の戦略になることはほとんどありません。

Task Parallel Library には、作業の分散を制御するために使用できる「パーティショナー」の概念が含まれています。これは、コア上のスレッドの分散を制御するより優れたソリューションです。

スレッドを実行するコアを特定し、スレッドを特定のコアに関連付けるにはどうすればよいですか?

あなたはこれをするべきではありません。.NET スレッドは、必ずしも OS スレッドに対応しているわけではありません。あなたはそれよりも高いレベルの抽象化にいます。現在、デフォルトの .NET ホストスレッドを 1 対 1 でマップするため、文書化されていない実装の詳細に依存したい場合は、抽象化を突いて P/invoke を使用してプロセッサ アフィニティを決定/駆動できます。しかし、上で述べたように、それは役に立ちません。

以前のバージョンの .NET では実行できなかった .NET 4.0 以降のタスク並列ライブラリでは何が可能になりましたか?

何もない。しかし、並列処理 (およびマルチスレッド化) がはるかに簡単になったことは確かです!

私がマルチスレッド開発に精通していることを考慮して、特に .NET4 以前 (.NET3.5) で並列コードを作成する方法のヒントを教えてください。

まず、そのプラットフォーム用に開発する理由はありません。なし。.NET 4.5 は既にリリースされており、最新バージョン (.NET 4.0) は、その次の古いバージョン (.NET 3.5) がサポートしていたすべての OS をサポートしています。

ただし、本当に必要な場合は、ThreadオブジェクトまたはをスピンアップするかBackgroundWorker、作業をスレッド プールに直接キューイングすることにより、単純な並列処理を行うことができます。これらのアプローチはすべてTask、TPL の型よりも多くのコード (特にエラー処理関連) を必要とします。

于 2013-03-11T12:13:16.303 に答える
6

「自分で開発した言語でビジネスソフトを書いていますか? 井戸を掘って水を飲んでいますか?」と聞いたらどうしますか?

これが、TPL を使用してスレッドの抽象化を使用できる一方で、スレッドを作成してそれらを管理することによってマルチスレッドを記述することの違いです。マルチコアとコアでのスレッドのスケジューリングは OS で維持されるため、システムがサポートするコアでスレッドが実行されるかどうかを心配する必要はありません。

于 2013-03-11T05:47:45.883 に答える
2

これは、以前のバージョンの .NET を使用してマルチコア d および並列プログラミング アプリケーションを作成できないということですか?

全くない。Threadやのような型はThreadPool、他のスレッドでの計算のスケジューリングやManualResetEvent同期のためのもので、.Net 1 から存在していました。

.NET マルチスレッド アプリケーションのコア間のマルチコア/並列使用/分配を制御しますか?

いいえ、それは主に OS の仕事です。を設定することはできますがProcessorAffinity、からProcessThreadを取得する簡単な方法はありません(もともと .Netは OS スレッドに直接対応しない可能性があると考えられていたため)。通常、これを行う理由はなく、特にスレッドに対しては行うべきではありません。ProcessThreadThreadThreadThreadPool

以前のバージョンの .NET では実行できなかった .NET 4.0 以降のタスク並列ライブラリでは何が可能になりましたか?

不可能を可能にしたわけではないと思います。しかし、多くのタスクがはるかに簡単になりました。

スレッド間の同期のために、いつでも独自のバージョンの を作成し、ThreadPool同期プリミティブ ( など) を手動で使用できます。ManualResetEventしかし、それを適切かつ効率的に行うと、多くのエラーが発生しやすい作業になります。

マルチスレッド アプリケーションの開発と並列プログラミングの .NET における違いは何ですか?

これは単なる命名の問題であり、以前の質問とはあまり関係がありません。並列プログラミングとは、複数の操作を同時に実行することを意味しますが、並列処理を実現する方法については言及していません。そのために、複数のコンピューター、複数のプロセス、複数のスレッド、さらには単一のスレッドを使用できます。

(シングル スレッドでの並列プログラミングは、ディスクからのファイルの読み取りやインターネットからのデータのフェッチなど、操作が CPU バウンドでない場合に機能します。)

したがって、マルチスレッド プログラミングは並列プログラミングのサブセットですが、.Net で最も一般的に使用されています。

于 2013-03-11T12:07:31.930 に答える
2

この記事を確認してください。基本的に、TPL 以前は (事実上) 不可能であったことを要約しています。多くの企業が独自の並列処理ライブラリを作成していたにもかかわらず、人気のあるアーキテクチャのすべてのリソースを活用するように完全に最適化されたものはありませんでした (単に大きいため)タスク & Microsoft には多くのリソースがあります + それらは優れています)。また、Intel の対応する実装TBBと TPL に注目するのも興味深いことです。

于 2013-03-11T05:49:33.690 に答える
1

マルチスレッドは、以前はシングルコア CPU で利用できました。.NET の世界では、"並列プログラミング" は、マルチコア機能 (以前よりも優れている) を促進する名前空間と "ライブラリ" の追加と同様に、コンパイラ/言語を表します。この意味で、「並列プログラミング」はマルチスレッドのカテゴリであり、複数の CPUa/コアのサポートを改善します。

私自身の熟考: 同時に、.NET の "並列プログラミング" には、マルチスレッドだけでなく、他の手法も含まれていると考えています。新しい async/await 機能はマルチスレッドを保証しないという事実を考慮してください。特定のシナリオでは、単一のスレッドですべてを達成できる継続渡しスタイルのパラダイムの抽象化にすぎないためです。さまざまなプロセス (潜在的にはさまざまなマシンで) を実行することから生じる並列処理をミックスに含めます。その意味で、マルチスレッドは「並列プログラミング」のより広い概念の一部にすぎません。

しかし、.NET のリリースを考慮すると、前者の方が適切な説明だと思います。

于 2013-03-11T07:09:53.290 に答える