假设我们有一个通用的线程池 - 具有通常预期的属性 - 您可以分配任务,并且首先可能池将分配资源来解决它。
当某些任务产生子任务并等待它们时,这种线程池会出现饥饿问题,这是一个非常常见的问题。问题是当前活动的任务可能会耗尽可用的线程,并且它们都会相互阻塞而没有资源来解除阻塞任何线程。
我过去实施了两种策略,半工作正常:
追踪饥饿并创建更多线程来解决它。这有明显的问题 - 根据深度,可能需要很多额外的线程。
重用线程以获得子任务。创建子任务时,等待功能是智能的,如果仍在等待,则使用该线程执行某些子任务。这样就可以保证不会完全阻止任务。这种策略虽然使优先级复杂化并且需要不可变数据(否则它可能会产生非常复杂的算法和锁定问题)。
我的问题是 - 你知道更好的策略,或者这两者中的哪一个似乎更适用于通用用例。