请注意,我不是在谈论任何特定语言的任何特定实现。
假设我有一个线程池和一个任务队列。当线程运行时,它会从任务队列中弹出一个任务并处理它 - 该线程可能会将其他任务添加到任务队列中。 线程必须处理某个任务的时间是无限的 - 这意味着线程可以工作直到任务完成,并且永远不会在此之前终止。
以下线程池配置容易受到哪些问题(例如死锁)?
我关注的可能的线程池配置:
1)带有有限数量的无界任务队列。的线程
2)带有无界数的有界任务队列。的线程
3)带有有限数的有界任务队列。线程。
4)无界数的无界任务队列。线程
另外 - 说现在线程处理每个任务的时间有限,如果它没有在给定的时间范围内完成任务,则被强制终止。这是如何改变的?
答案 0 :(得分:2)
如果您有一定数量的线程,那么如果在池线程上运行的任务向队列提交新任务然后等待该任务,则可能会遇到死锁 - 如果没有空闲线程则新任务将不会运行,原始任务将阻塞,阻止池线程,直到新任务可以运行。如果你最终得到足够的这些被阻止的任务,那么整个池可能会死锁。
除非绑定与线程数相同,否则绑定任务数并没有真正帮助 - 一旦每个线程执行某些操作,就不能再提交新任务了。
帮助是(a)在线程被阻塞时添加新线程,或者(b)如果池线程任务正在等待来自同一池的另一个任务,那么该线程切换到运行正在等待的任务对
如果你有无限数量的线程,那么你必须注意超额认购---如果我有一个四核机器,但提交1000个任务,并运行1000个线程,那么这些将相互竞争并减缓一切下来。
实际上,由于硬编码,或者由于内存限制,操作系统将线程数限制在一定数量 - 每个线程都需要一个新的堆栈,所以你只能拥有多个线程线程,因为你有堆栈的记忆。
除非你在任何时间限制之后开始强行终止任务,否则无论你使用何种方案,如果他们彼此等待,你总是会遇到2个任务的死锁。
强行终止任务的问题是双重的。首先,您需要与等待该任务的任何代码进行通信,该任务被强制终止而不是正常结束。其次(这是更大的问题)你不知道任务处于什么状态。它可能拥有一个锁或任何其他资源,强行终止任务会泄漏这些资源,并可能使应用程序处于糟糕的状态。