我正在尝试开发一个由线程池组成的应用程序,使用工作窃取算法同时执行任务。
这些任务
- 访问一组预定义的对象;
- 必须在实际运行之前“原子地”获取它访问的所有对象的读/写权限;
- 完成后(并保证最终完成)释放他们获得的对象。
解决此问题的一种可能方法是让每个线程一次执行一项任务,然后尝试使用预定义的顺序锁定每个对象。如果至少有一个失败,则释放所有锁,然后继续执行另一项任务。
然而,这种方法增加了具有大对象依赖性的任务饥饿的可能性,甚至可能导致活锁。
是否有另一种方法可以在最大化并发的同时获取一组锁?(没有全局锁)或者可能以不再需要的方式更改系统?如果是这样,有什么好的论文吗?
ps:正如 thiton 回答的那样,这是“哲学家就餐”问题的广义版本。我正在寻找非集中式解决方案,特别是在高负载(添加和删除任务)中表现良好的算法。