gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:59 25 4
gpt4 key购买 nike

有什么方法可以实现吗?

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

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

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

最佳答案

改变你的设计。

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

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

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

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

一个潜在的问题是,你可以让一些总是忙碌的对象让其他对象挨饿,但你可以通过简单地检查你已经处理了多少任务来避免这种情况,如果它超过了一个可调的最大值,然后将下一个任务推回 IOCP以便其他对象有机会。

关于c++ - 如何同时等待 I/O 完成端口和事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11068839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com