1

ユーザーが提供するいくつかの条件に応じてマンデルブロ集合を表示するプログラムを書いています。計算に時間がかかる (500 ミリ秒以上) ため、複数のスレッドを使用することにしました。以前の経験がなくても、System.Threading.Tasks クラスを使用してそれを行うことができました。これは問題なく動作します。私が気に入らない唯一のことは、マンデルブロが生成されるたびに、スレッドが作成されてから破棄されることです。

これがどのように機能するかの例です。メソッドが呼び出されるたびにスレッド (タスク) を作成します。

for (int i = 0; i < maxThreads; i++) {
    int a = i;
    tasks[a] = Task.Factory.StartNew(() => generateSector(a));
}

それがパフォーマンスにどのように影響するかは実際にはわかりませんが、スレッドの作成と破棄には時間がかかるようで、スレッドの準備を整えてトリガーメッセージを待機する方が効率的であり、完了したら元に戻りますその待機状態。この考えを理解するには、次のコード例が役立つかもしれません。

for (int i = 0; i < maxThreads; i++)
    tasks[i].sendMessage("Start"); // Tells the running thread to begin its work

そのため、各スレッドは無限ループを実行し、計算が必要になるまで待機します。その後、待機を続けます。このようなもの:

// Into the method that a thread executes
while(true) {
    Wait(); // Waits for the start signal
    calculate(); // Do some calculations
}   // Go back to waiting

その方が効率的ではないでしょうか?それを行う方法はありますか?

4

3 に答える 3

4

コードはそのままにしておきます。

1) タスクは ThreadPool スレッドを使用するため、問題ありません

2) 「それがパフォーマンスにどのように影響するかはよくわかりません」 - ここから始めるべきです。測定前に最適化しないでください。パフォーマンスの問題がありますか? コードの実行が遅いですか? いいえ、気にしないでください。

于 2013-09-24T13:58:17.720 に答える
1

を使用する場合Task.Factory.StartNew(...)、必ずしもスレッドを作成および破棄しているわけではありません。タスク ライブラリは を使用しThreadPoolてこれを行うため、 を自分で作成した場合new Thread()ように自分で管理する必要はありません。

于 2013-09-24T13:58:32.040 に答える