應該從不同角度看libevent的同步/異步、阻塞/非阻塞:
-
IO數量的角度:select出來之前,會阻塞在一個io上,處理完成后再阻塞在下一個io上;之后就是把所有的io fd拿過來,都不阻塞,一個一個fd去詢問是否可讀,每次詢問完后把可讀的io fds返回;所以說:libevent是非阻塞的;
-
libevent運行在不同的線程上:select本質上是一個while詢問,難道while不是阻塞嗎?所以說調用event_base_dispatch()的線程是阻塞的;所以這樣說:libevent是阻塞的;
-
IO操作流:盡管select能監聽一群IO的fds,但某個IO的fd不是也得等待事件通知來了后才會回調callback嗎? 所以說:libevent是同步的。
總結:libevent是同步的,但不能說是阻塞或者非阻塞。這也是為什么官方介紹上沒有同步/異步,阻塞/非阻塞字樣介紹libevent。
同時,有兩個問題值得思考下:
1. 既然select/poll/epoll能夠實現監聽多個fd,那為什么在監聽socket的時候需要設置為非阻塞呢? (見UNP)
2. 異步IO是怎么實現的? (見linux的AIO,將IO調用和要處理的內容地址交給內核,內核把所有任務處理完畢后將結果放到內容地址里,用戶進程可以來該地址查看是否完成)