5

有没有可能的方法来实现这一目标?

例如,我有一个 I/O 完成端口,有 10 个工作线程从中拉出任务。每个任务都与一个对象相关联。有些对象不能同时处理,所以如果一个线程正在处理其中一个对象,而第二个线程拉出需要这个对象的任务,则第二个线程必须等待第一个线程完成。

作为一种变通方法,对象可能有一个在释放时发出信号的事件。如果一个线程因为接收到的任务需要一个锁定的对象而被“卡住”,它可以等待锁定的对象被释放,或者等待新任务排队。如果它选择了一个新任务,它将把它无法处理的任务推回队列中。

我知道替代方法,但这似乎是应该存在的功能。这可以通过 Windows API 实现吗?

4

2 回答 2

3

改变你的设计。

向对象添加内部任务队列。然后,当一个任务发布到 IOCP 时,让 IOCP 线程将该任务放入对象的任务队列中,如果没有其他线程正在“处理”该对象的任务,则让该 IOCP 线程将该对象标记为正在处理并开始处理该任务; (锁定每个对象队列,添加任务,检查我们是否应该成为处理线程,解锁队列)然后处理对象中的任务或返回 IOCP。

当另一个线程有相同对象的任务时,它也会经历相同的进程。请注意,处理对象的线程不会在对象的任务队列上持有锁,因此新的 IOCP 线程可以将任务添加到对象的队列中,然后看到线程已经在处理并简单地返回到 IOCP。

一旦线程完成当前任务,它会再次检查对象的任务队列并继续处理下一个任务,或者,如果队列为空,则将对象标记为未处理并返回到 IOCP。

这可以防止您在尚未运行的任务上阻塞 IOCP 线程,并维护当时恰好正在处理的线程的数据局部性。

一个潜在的问题是,您可以让一些总是忙碌的对象饿死其他对象,但您可以通过简单地检查您已处理的任务数量以及它是否超过可调整的最大值然后将下一个要处理的任务推回 IOCP 来避免这种情况,以便其他对象有机会。

于 2012-06-17T17:13:11.140 回答
1

想法解决方案是让一个线程等待事件并在事件发生时发布到完成端口。或者,让一个线程等待事件并处理它。如果您需要做两件根本不同的事情,请使用两个线程来完成它们。

于 2012-06-17T04:28:29.337 回答