请注意,我不是在谈论任何特定语言的特定实现。
假设我有一个线程池和一个任务队列。当线程运行时,它从任务队列中弹出一个任务并处理它-因此,该线程可能会将额外的任务添加到任务队列中。线程必须处理某个任务的时间是无限的-这意味着线程一直工作到任务完成,并且在此之前永远不会终止。
下面的线程池配置容易出现什么类型的问题(例如死锁)?
我关心的可能的线程池配置:
1) num有界的无界任务队列。线程的数量
2)具有无界数目的有界任务队列。线程的数量
3)有界任务队列。线程的数量。
4)无界数的无界任务队列。线程的数量
还有-假设现在线程处理每个任务的时间是有限的,如果它没有在给定的时间范围内完成任务,那么它将被强制终止。这会如何改变事情呢?
发布于 2011-02-18 18:00:20
如果你有一个有限数量的线程,那么如果运行在池线程上的任务提交一个新任务到队列,然后等待该任务-如果没有空闲线程,那么新任务将不会运行,并且原始任务将阻塞,直到新任务可以运行,那么您可能会遇到死锁。如果你最终得到了足够的阻塞任务,那么整个池就会死锁。
限制任务的数量并没有真正的帮助,除非限制与线程的数量相同-一旦每个线程都在做一些事情,那么你就不能再提交新的任务了。
有帮助的是(a)当线程被阻塞时添加新的线程,或者(b)如果池线程任务正在等待来自同一池的另一个任务,那么该线程将切换到运行正在等待的任务。
如果你有无限数量的线程,那么你必须注意超额订阅-如果我有一台四核机器,但提交1000个任务,然后运行1000个线程,那么这些线程将相互竞争,从而减慢一切。
在实践中,由于硬编码数字或内存限制,线程的数量被操作系统限制为某个较大的数字-每个线程都需要一个新的堆栈,因此线程的数量只能与其堆栈的内存数量一样多。
无论你使用哪种方案,如果两个任务相互等待,除非你在一个时间限制后开始强制终止任务,否则你总是会得到一个死锁。
强制终止任务的问题有两个。首先,您需要向等待该任务的任何代码传达该任务已被强制终止,而不是正常完成。其次(这是更大的问题),你不知道任务处于什么状态。它可能拥有一个锁或任何其他资源,强行终止任务将泄漏这些资源,并可能使应用程序处于糟糕的状态。
https://stackoverflow.com/questions/5033409
复制相似问题