一段时间以来,我一直在大量搜寻以了解在nix机器上实现异步编程/行为的各种方法,并且(如我之前所知)得到证实,因为事实是仍然没有TRULY异步模式(并发)适用于Windows(IOCP)的Linux使用单线程)。
以下是针对Linux的一些替代方案:
现在问题来了:)
上面的说法有多正确?为什么不能使用epoll在磁盘I/O上进行异步编程?
希望有人也能回答所有问题,并提供很好的解释。还应该感谢任何指向epoll和AIO设计模式的实现细节的源代码链接。
最佳答案
这是不正确的。在最新的Linux内核版本上,默认情况下,Asio库使用epoll()
。但是,调用io_service::run()
的线程将根据需要调用回调处理程序。在Asio库中,只有一个地方可以使用线程来模拟异步接口(interface),这在documentation中有很好的描述:
正如您所声称的那样,这并不会使库“不是真正的异步模式”,实际上其名称在定义上会与您不同。
我建议使用Boost Asio,它使用proactor设计模式。
epoll react 器使用互斥锁来调度处理程序,尽管实际上这对于大多数应用程序来说并不是大问题。有一些特定于应用程序的方法可以减轻这种行为,例如每个CPU的io_service
可以利用数据局部性。有关此主题的类似问题,请参见my answer。还经常在Asio mailing list上进行讨论。
如您所述,Asio库本身不支持文件I/O。我曾尝试过将其添加到库中,但建议您在mailing list上进行讨论。
关于c++ - 了解* nix上异步编程的基础,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8776416/