如何“释放”一个线程

4

我在程序中同时运行了20个线程,(创建20个线程并等待它们完成,然后启动另外20个),一段时间后我的程序变得非常缓慢。我需要释放任务或者执行任何特殊的操作吗?如果是,请问如何释放任务或进行特殊操作,如果不是,那么像这样的程序为什么会变慢有一个共同的原因吗?


它们是线程池线程,还是你在明确地管理它们? - drharris
可能是重复问题:https://dev59.com/nGw05IYBdhLWcg3w4125#6961264 - Hans Passant
2个回答

12
你可能想考虑直接使用ThreadPool, 或通过任务并行库来使用(我比较推荐这种方式)。这很可能比自己创建线程并重复地阻塞它们更好、更简单和更清晰。
话虽如此,如果你的程序变得越来越慢,这是一个可以极大帮助的问题。没有看到代码,很难诊断问题。例如,根据你所做的工作,你可能会导致垃圾回收器的效率随着程序执行的进行而降低,这可能导致在执行过程中花费在垃圾回收上的时间百分比上升。通过分析可以让你对程序执行时花费时间的原因有很好的了解。

1
Reed的回答可能是处理您问题的最佳方式;但是,如果您确实想要自己管理线程,而不使用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个线程已完成,重置数据桶并清除所有线程互斥锁。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接