为何Boost的asio要使用proactor模式实现?

Windows 下很难完成高效可伸缩的 Reactor。首先,Win32 API 里 WaitForMultipleObjects 只能同时等候 64 个 handle (MAXIMUM_WAIT_OBJECTS);其次 WinSock 的 select() 完成又很 buggy,特别是在错误处置方面有很多奇葩行为(详细见各种跨平台网络库代码中对此的注释);最后,Windows Vista 新增的 WSAPoll() 函数与 POSIX 的 poll() 又不尽兼容。

Windows 有自己的一套高效异步IO模型(简直同等于Proactor),同时支持文件IO和网络IO;但 Linux 只要高效的网络同步IO(epoll 之类的 io multiplexing 是同步的Reactor,且不支持磁盘文件),二者的高效IO编程模型从基本上不兼容(Windows 可以把网络事情发到 GUI 线程的事情队列中,有点相似 Reactor,但是似乎一个进程只能有一个 GUI 线程,因此在多核系统上其伸缩性受限)。

因此,ASIO 要想高效且跨平台,只能用 Proactor 模型了。不可防止地会在 Linux 上损失一点儿效率。

提供最优质的资源集合

立即查看 了解详情