0

基本的に、Task クラスと Thread クラスがあり、物理コア (または Intel CPU コアではカウントが 2 倍になるため、論理コア) の量に等しいスレッドを作成します。

したがって、基本的にスレッドはタスクのリストからタスクを取得して実行します。ただし、すべてが安全であることを確認する必要があり、複数のスレッドが同じタスクを一度に取得しようとしないため、もちろんこれにより余分なオーバーヘッドが発生します (および頭痛の種)。 .

タスク機能をスレッド内に配置する理由は?つまり、4 つのスレッドが 200 のタスクのプールからタスクを取得する代わりに、200 のスレッドが 4 x 4 のグループで実行されるのではなく、基本的に何も同期する必要がないということです。ロック、何もありません。もちろん、初期化時だけで、ランタイム全体でスレッドを作成することはありません。

このような方法にはどのような長所と短所がありますか?私が考えることができる 1 つの問題は、初期化時にしかスレッドを作成しないため、スレッドの数は固定されていますが、タスクを使用すると、タスク プールにさらに多くのタスクをダンプし続けることができます。

4

3 に答える 3

1

スレッドにはコストがかかります。スレッドごとに、TLS 用とスタック用のスペースが少なくとも必要です。

于 2013-01-31T23:59:13.970 に答える
0

Task クラスと Thread クラスを分離しておくと、長期的にはよりクリーンで管理しやすいアプローチになり、任意の時点で作成および実行されるスレッドの数を制限できるため、オーバーヘッドを抑えることができます (また、Task が占有する可能性があります)。スレッドよりもメモリが少なく、必要に応じて作成および解放が高速です)。タスクは、何を行うかを制御するものです。スレッドは、タスクがいつ実行されるかを制御するものです。はい、Task オブジェクトをスレッドセーフ リストに格納する必要がありますが、クリティカル セクション、ミューテックス、セマフォなどを使用して実装するのは非常に簡単です。特に Windows では、代わりに I/O 完了ポートを代わりに使用できます。タスクをスレッドに送信し、OS に同期とスケジューリングを処理させます。

于 2013-02-01T00:03:44.230 に答える
0

200 の「タスク」を実行するために 4 つのスレッドを実行するよりも、一度に 200 のスレッドを実行するほうが確実に時間がかかります。簡単な計算を行う簡単なプログラムでこれをテストできます (たとえば、最初の 20000000 の素数を計算する、各スレッドに一度に 100000 の数字を実行するように要求し、次のロットを取得する、またはそれぞれ 100000 の数字で 200 のスレッドを作成する)。

どのくらい遅くなりますか?わからない、非常に多くのことに依存します。

于 2013-02-01T00:05:37.010 に答える