ユーザーが提供するいくつかの条件に応じてマンデルブロ集合を表示するプログラムを書いています。計算に時間がかかる (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
その方が効率的ではないでしょうか?それを行う方法はありますか?