我正在编写一个程序,根据用户提供的某些条件显示 mandelbrot 集。由于计算需要很长时间(超过 500 毫秒),我决定使用多个线程。没有任何以前的经验,我已经设法通过使用 System.Threading.Tasks 类来做到这一点,它工作得很好。我唯一不喜欢的是,每次生成 mandelbrot 时,都会创建线程然后销毁。
这是它如何工作的一个例子。每次调用该方法时,它都会创建线程(任务)。
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
这样会更有效率吗?有没有办法做到这一点?