支持重叠 I/O(对于 IOCP)的定时器?
我需要在基于 I/O 完成端口 (IOCP) 的应用程序中添加计时器支持。我想避免使用特定线程来管理计时器。
在 Linux 上,您可以创建一个通过文件描述符传递过期通知的计时器(请参阅timerfd.h man),因此如果您的应用程序基于 epoll,那么将它与 epoll 一起使用是非常好的。
在 Windows 上,您可以将“可等待计时器”与异步过程调用 (ACP) 结合使用(请参阅 http://msdn.microsoft.com/en-us/library/ms686898(v=VS.85).aspx)
如果您有兴趣,kqueue(BSD、Mac OS )默认支持计时器(请参阅 EVFILT_TIMER)。
对于 I/O 完成端口,我们必须使用支持重叠 I/O 的对象。那么,IOCP有这样的定时器吗?
最好的问候,
塞德里克斯
I need to add timers support in an application based on I/O Completion Ports (IOCP). I would like to avoid the use of a specific thread to manage timers.
On Linux, you can create a timer that delivers expiration notifications via a file descriptor (see timerfd.h man), so it's great to use it for example with epoll if your application is based on epoll.
On Windows, you can use "waitable timers" with an asynchronous procedure call (ACP) (see http://msdn.microsoft.com/en-us/library/ms686898(v=VS.85).aspx)
If you are interested, kqueue (BSD, Mac OS) supports timers by default (see EVFILT_TIMER).
With I/O Completion Ports, we have to use objets that support overlapped I/O. So, is there such a timer for IOCP ?
Best regards,
Cédrics
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
据我所知,没有定时器在到期时生成 IOCP 完成。
你可以尝试Windows定时器队列; CreateTimerQueueTimer。
我最终编写了自己的计时器队列,它确实使用额外的线程来运行计时器,因此它可能对您没有好处:请参阅此处 查看我使用 TDD 和完整单元测试实现队列的一系列文章。我正在实现具有相同接口的更高性能的 TimerWheel,但同样将使用外部线程来管理计时器。
As far as I know there are no timers that generate a IOCP completion when they expire.
You could try the Windows timer queue; CreateTimerQueueTimer.
I ended up writing my own timer queue which does use an extra thread to run the timers, so it's probably no good for you: See here for a series of articles where I implement the queue with TDD and full unit tests. I'm in the process of implementing a higher performance TimerWheel with the same interface, but again that will use an external thread to manage the timers.
您可以使用可等待计时器,并使用“PostQueuedCompletionStatus”将自定义数据包排队到完成端口。但请记住,如果有多个工作线程,则只有其中一个线程会收到通知。
You could use waitable timers and queue a custom packet to the completion port using "PostQueuedCompletionStatus". But remember that if there are multiple worker threads only one of the thread will be notified.