zoukankan      html  css  js  c++  java
  • libevent到底是同步还是异步,是阻塞还是非阻塞

            应该从不同角度看libevent的同步/异步、阻塞/非阻塞:
    1. IO数量的角度:select出来之前,会阻塞在一个io上,处理完成后再阻塞在下一个io上;之后就是把所有的io fd拿过来,都不阻塞,一个一个fd去询问是否可读,每次询问完后把可读的io fds返回;所以说:libevent是非阻塞的;
    2. libevent运行在不同的线程上:select本质上是一个while询问,难道while不是阻塞吗?所以说调用event_base_dispatch()的线程是阻塞的;所以这样说:libevent是阻塞的;
    3. IO操作流:尽管select能监听一群IO的fds,但某个IO的fd不是也得等待事件通知来了后才会回调callback吗? 所以说:libevent是同步的。
    总结:libevent是同步的,但不能说是阻塞或者非阻塞。这也是为什么官方介绍上没有同步/异步,阻塞/非阻塞字样介绍libevent。
     
             同时,有两个问题值得思考下:
             1. 既然select/poll/epoll能够实现监听多个fd,那为什么在监听socket的时候需要设置为非阻塞呢? (见UNP)
             2. 异步IO是怎么实现的? (见linux的AIO,将IO调用和要处理的内容地址交给内核,内核把所有任务处理完毕后将结果放到内容地址里,用户进程可以来该地址查看是否完成)
  • 相关阅读:
    分布式锁获取token
    美团-2019Q2述职总结
    linux df 日志删除命令分析
    MySQL、HBase、ES的特点和区别
    C++函数返回局部变量
    C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理
    C Mysql API连接Mysql
    C++运算符重载
    C++对象赋值的四种方式
    C/C++下scanf的%匹配以及过滤字符串问题
  • 原文地址:https://www.cnblogs.com/thinksasa/p/12899684.html
Copyright © 2011-2022 走看看