2011-02-17 75 views
0

请注意,我不是在谈论任何特定语言的具体实现。线程池配置问题

可以说我有一个线程池和一个任务队列。当线程运行时,它会从任务队列中弹出一个任务并对其进行处理 - 因此,该线程可能会将其他任务添加到任务队列中。 线程必须处理某个任务的时间是无限的 - 意味着线程在任务完成之前一直运行,并且永远不会在此之前终止。

下列线程池配置容易受到哪些类型的问题(例如死锁)?

可能的线程池配置我很关心:
1)带有限数目的无界任务队列。线程
2)带有无限数量的有界任务队列。线程
3)带有限数目的有界任务队列。线程。
4)无界数量的无界任务队列。线程

另外 - 说现在线程处理每个任务的时间有限,如果它没有在给定的时间范围内完成任务,则被强制终止。这是如何改变的?

回答

2

如果线程数有限,那么如果在线程池上运行的任务将新任务提交到队列,然后等待该任务---如果没有空闲线程,则可以遇到死锁任务将不会运行,原始任务将会阻塞,直到新任务可以运行为止。如果最终得到足够的这些阻塞的任务,那么整个池可能会发生死锁。

这并不是通过限制任务的数量来实现的,除非绑定与线程的数量相同---每个线程执行一些操作后就不能再提交新的任务。

有什么帮助是:(a)当一个线程被阻塞时添加新线程,或者(b)如果一个池线程任务正在等待来自同一个池的另一个任务,那么该线程切换到正在运行的任务等待。

如果你有一个无限数量的线程,那么你必须留意超额订购---如果我有一个四核机器,但提交1000个任务,并运行1000个线程,那么这些将互相竞争,慢一切都下降。

实际上,由于硬编码的数字或由于内存限制,线程的数量由操作系统限制到某个大数目---每个线程都需要一个新的堆栈,所以您只能拥有许多线程,因为你有他们的堆栈内存。

如果两个任务彼此等待,无论您使用何种方案,都可以始终发生死锁,除非您在时间限制后强制终止任务。

强行终止任务的问题是双重的。首先,您需要与正在等待该任务的任何代码进行通信,以强制终止该任务,而不是正常结束。其次(这是更大的问题),你不知道任务的状态。它可能拥有一个锁或任何其他资源,强行终止任务会泄露这些资源,并有可能将应用程序留在坏的状态。