事件模型是否是异步的?解决方案

事件模型是否是异步的?
事件模型是否是异步的?

异步概念:调用某个函数,立即返回,这个线程其实在一个线程里运行。 而你的线程却继续往下执行。
异步函数也在运行。

 
windows事件: 有太多了,比如:点击按钮,也是事件,但是我们这里说的事件,是专指:网络中的io模型。


一个模型下有的函数式堵塞,有的则不是,这里以send,recv,accpet这几个函数来区分,是否异步:




EventSelect模型。其是否是异步的?  按照上面的概念来看,那些函数send, recv,accept等都不是立即返回的。

结论:非异步非堵塞模型。




异步选择模型(AsysnSelct)是否是异步?

字面意思,带有异步2字,必然是异步的? 

没使用过,但是使用过CAsyncSocket类,很多函数却是立即返回。



select模型:

非异步非堵塞

重叠io



异步非堵塞

iocp
异步非堵塞




------解决方案--------------------
异步与模型有关,不可能用setsockopt来设置。
windows下的异步只有重叠io和iocp,linux下的aio也是异步,epoll这么高级的东西,也不是异步。

对于发送:异步就是把数据交给系统,系统发送完了之后通知你;
对于接收:异步就是把缓存交给系统,系统收到数据之后通知你;

其它的模型,都是查询式模式,即你向系统提问,某个套接可读可写了吗?系统告诉你可以,你才真正的send或者recv。

异步与阻塞与否也无关,但异步下往往将套接字设置为非阻塞(特别是你要在非异步模型上写一个异步模型,比如boost.asio),便于处理。