如何同时等待I / O完成端口和事件?

时间:2012-06-17 04:06:05

标签: c++ c multithreading winapi iocp

有没有办法实现这个目标?

例如,我有一个I / O完成端口,10个工作线程正在从中拉出任务。每个任务都与一个对象相关联。某些对象无法同时处理,因此如果一个线程正在使用其中一个对象而另一个线程执行需要此对象的任务,则第二个线程必须等待第一个完成。

作为一种解决方法,对象可能会有一个在发布时发出信号的事件。如果线程被“卡住”,因为收到的任务需要一个锁定的对象,它可以等待锁定的对象被释放,或者等待一个新的任务排队。如果它拿起一个新任务,它将把它无法工作的任务推回到队列中。

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

2 个答案:

答案 0 :(得分:3)

更改您的设计。

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

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

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

这可以防止您阻止无法运行的任务上的IOCP线程,并将数据的位置维护到当时正在处理的线程。

一个潜在的问题是,你可以让一些忙碌的对象挨饿,但你可以通过简单地检查已处理的任务数量来避免这种情况,如果超过可调整的最大值,则推动下一个任务处理回IOCP这样其他物体就有机会。

答案 1 :(得分:1)

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