我的程序中一次运行20个线程,(创建20个等待它们完成,再启动20个),过了一段时间我的程序慢了下来。我是否需要释放任务或做任何特别的事情?如果是这样的话,如果没有这样一个常见的原因,为什么这样的程序会减慢?
答案 0 :(得分:12)
您可能需要考虑直接使用ThreadPool
,或通过Task Parallel Library(我的首选选项)。这可能比产生自己的线程并重复阻塞它们更好,更简单,更简洁。
话虽这么说,如果你的程序逐渐变慢,那么分析器可以帮助你大大提高帮助。没有看到代码,诊断起来非常困难。例如,根据您正在进行的工作,您可能会导致GC随着时间的推移变得不那么有效,这可能导致GC花费的时间百分比随着程序继续执行而攀升。分析应该可以很好地指示程序执行时花费的时间。
答案 1 :(得分:1)
里德的回答可能是解决问题的最佳方式;但是,如果你想自己管理线程,而不是使用ThreadPool或TPL,我必须问为什么你会让20个线程死掉并再创建20个线程。创建线程是一个昂贵的过程,这就是线程池存在的原因。如果您持续具有相同数量的并行任务或最大数量,则应创建一次并重复使用它们。您可以使用锁定结构(如信号量和互斥锁),让线程在完成后等待,只需为它们提供新数据即可使用并释放它们以便再次运行。等待锁定是一种非常便宜的操作 - 比重新创建线程便宜几个数量级。
例如,一个线程可能看起来像这样(伪代码):
while (program_not_ending)
{
wait_for_new_data_release; // Wait on thread's personal mutex
process_new_data;
resignal_my_mutex; // Cause the beginning of loop to wait again
release_semaphore_saying_I_am_done; // Increment parent semaphore count
}
父母将等待其信号量填满完成的20个线程,重置数据桶,并清除所有线程互斥。