首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程池配置问题

线程池配置问题
EN

Stack Overflow用户
提问于 2011-02-18 03:09:29
回答 1查看 708关注 0票数 0

请注意,我不是在谈论任何特定语言的特定实现。

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

下面的线程池配置容易出现什么类型的问题(例如死锁)?

我关心的可能的线程池配置:

1) num有界的无界任务队列。线程的数量

2)具有无界数目的有界任务队列。线程的数量

3)有界任务队列。线程的数量。

4)无界数的无界任务队列。线程的数量

还有-假设现在线程处理每个任务的时间是有限的,如果它没有在给定的时间范围内完成任务,那么它将被强制终止。这会如何改变事情呢?

EN

回答 1

Stack Overflow用户

发布于 2011-02-18 18:00:20

如果你有一个有限数量的线程,那么如果运行在池线程上的任务提交一个新任务到队列,然后等待该任务-如果没有空闲线程,那么新任务将不会运行,并且原始任务将阻塞,直到新任务可以运行,那么您可能会遇到死锁。如果你最终得到了足够的阻塞任务,那么整个池就会死锁。

限制任务的数量并没有真正的帮助,除非限制与线程的数量相同-一旦每个线程都在做一些事情,那么你就不能再提交新的任务了。

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

如果你有无限数量的线程,那么你必须注意超额订阅-如果我有一台四核机器,但提交1000个任务,然后运行1000个线程,那么这些线程将相互竞争,从而减慢一切。

在实践中,由于硬编码数字或内存限制,线程的数量被操作系统限制为某个较大的数字-每个线程都需要一个新的堆栈,因此线程的数量只能与其堆栈的内存数量一样多。

无论你使用哪种方案,如果两个任务相互等待,除非你在一个时间限制后开始强制终止任务,否则你总是会得到一个死锁。

强制终止任务的问题有两个。首先,您需要向等待该任务的任何代码传达该任务已被强制终止,而不是正常完成。其次(这是更大的问题),你不知道任务处于什么状态。它可能拥有一个锁或任何其他资源,强行终止任务将泄漏这些资源,并可能使应用程序处于糟糕的状态。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5033409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档