与Linux等效的IO完成端口

与Linux等效的IO完成端口,linux,multithreading,winapi,Linux,Multithreading,Winapi,Windows OS,一种线程模型,其中线程池与IO完成关联,~释放~线程每次异步IO完成时,~释放~线程用于处理IO完成 虽然linux select可用于异步IO,但它似乎不支持IO完成/线程池逻辑 在线程模型之上是否有与IO Completion/ThreadPool等效的Linux?我不知道有什么可以直接做到这一点,但您可以将select()循环与您自己的线程池结合起来,以获得类似的行为。当select()返回并检查fd\u集s以查看哪些文件描述符已准备就绪时,将这些描述符推送到线程池进

Windows OS,一种线程模型,其中线程池与IO完成关联,~释放~线程每次异步IO完成时,~释放~线程用于处理IO完成

虽然linux select可用于异步IO,但它似乎不支持IO完成/线程池逻辑


在线程模型之上是否有与IO Completion/ThreadPool等效的Linux?

我不知道有什么可以直接做到这一点,但您可以将
select()
循环与您自己的线程池结合起来,以获得类似的行为。当
select()
返回并检查
fd\u集
s以查看哪些文件描述符已准备就绪时,将这些描述符推送到线程池进行处理。您仍然需要一个主线程来运行
select()
循环,独立于处理I/O事件的线程池

这种方法的大部分复杂性在于如何跟踪每次迭代时
select()
调用以及线程池本身需要包含哪些描述符(因为POSIX提供线程,但不是标准的线程池API)


您可能会对使用类似的库感兴趣,它提供了一个模块,有助于对一组不同的文件描述符进行轮询,还提供了一个实现。

select()
不是完全异步的。尝试libaio.True,它会阻塞,直到读/写缓冲区准备好接收或包含其他数据,如果不是,它会阻塞,因此,在等待多个描述符时,一旦任何描述符变为~available~,它就会停止阻塞,也就是说,使用一个线程为多个句柄执行select可以节省其他线程执行select的负担(每个线程都为自己的描述符),从而导致这些线程的异步行为(其中一个专用线程代表它们执行select)