2011-06-30 26 views
0

我在等待列表中有n个任务。 每个任务都有与之相关联的,它包含了一些元数据信息的条目:如何根据一些关联的元数据从列表中选择任务?

Task1 A,B
Task2 A
Task3 B,C
Task4 A,B,C

和包含像条目的asssociated的HashMap:

A 1 
B 2 
C 2 

这意味着,如果一个任务,包含在其元信息A已经在运行,则不能同时运行包含 A的其他任务。 但是,由于B具有2个任务的限制,因此任务1和任务3可以一起运行,也可以运行任务3和任务4。 但是task1,task3和task4不能同时运行,因为A和B的限制都会被违反,尽管C的限制并不违反 。

如果我需要选择在不同的线程中运行的任务,你会建议什么逻辑/算法?而且,何时应该调用这个逻辑 ?我将任务列表视为共享资源,当从中选择任务 时,可能需要将其锁定。现在,我认为当任务被添加到列表中时可能必须调用此逻辑,并且在正在运行的任务完成时也可以调用此逻辑。但是这可能会阻止向列表中添加新元素,除非在运行逻辑之前创建列表副本。

如果我给予比A,B,C' 含有更多条目的任务的优先级高于'A,B',那么您的逻辑将如何改变?

这是Choosing a data structure for a variant of producer consumer problemHow to access the underlying queue of a ThreadpoolExecutor in a thread safe way的延续,以防万一任何人想知道问题的背景。

回答

0

是的,这是讨厌的。我立即想到了一个数组/信号量列表,从散列图初始化,任何尝试执行任务的线程都必须根据这些元数据定义单元。大约一秒钟后,我意识到这样的设计会很快死锁!

我认为一个专用的生产者线程将不得不遍历一个'readyJobs'列表,试图找到一个可以使用当前资源执行的任务。它可以在新任务变得可用时和任务完成后这样做,释放资源。生产者线程可以在一个输入队列(线程安全的生产者 - 消费者队列)上等待,其中[任何地方]的两个新任务都被排队,并且完成从工作线程排队的任务(工作线程触发的回调将完成的任务推送到输入队列?)。添加新任务可能会暂时被阻止,但仅当输入队列被添加的其他任务阻塞时。

在分配'priorites'的情况下,您可以根据需要插入'readyJobs'列表,以便首先检查更高优先级的任务以查看它们是否可以使用可用资源运行。如果他们不能,那么列表的其余部分将被迭代,而低优先级的作业可能会运行。

我希望你不想“抢占”低优先级的任务,以便提前释放资源 - 这将得到真的,真的凌乱:(

RGDS, 马丁

+0

我刚才读的链接到您的所有其他要求:(( –

+0

尽管如此,我仍然会用专用生产线接近这一点,所以顺序访问逻辑,并消除对明确的锁的需要。如果生产商(或任何其他线程),想要一个。准备/ INPROGRESS列出的快照,它可以排队了它的请求,(与请求内的事件等待),生产者输入队列,与所有其他的东西一起。生产者日然后读取可以向请求添加它管理的ready/inProgress队列数据的快照(复制),然后发信号通知事件。这避免了复杂的锁定方案(即间歇性死锁)。 –

相关问题