![]() |
Euv部分是针对Emx开发人员需要使用的部分,SDK的使用者需要了解本小结中关于EuvLoop的使用
Emx的日常编程中会经常使用到Euv提供的各种组件,需要开发人员熟练掌握Euv的使用方法和内部原理
Euv模块是对开源libuv库的C++封装,其拥有跨平台的特性,内部使用select/epoll/kqueue/IOCP等技术来完成IO的多路复用,Emx的整体架构都是基于此特性构建出来,关于libuv的详细介绍可参考libuv
Euv的核心是EuvLoop,一个EuvLoop就是一个线程,是各路IO复用的载体,负责如EuvAsync/EuvDns/EuvTimer/EuvTcp等句柄(事件)的监听和运行,EuvLoop启动运行后,对参与EuvLoop循环的所有句柄的操作都必须在EuvLoop内进行(EuvAsync除外),否则将面临线程安全的问题。在EuvLoop启动之前可以注册若干个事件,启动后也可在loop内执行注册事件操作(不可在loop外执行),EuvLoop内部使用select/epoll等去监听这些注册的事件,举个EuvTimer定时器的例子
必须注意的是,因为一个EuvLoop就是一个线程,所以所有注册在这个loop中的事件回调都是按照事件的发生顺序依次执行的,虽然这使得loop内的各个事件之间共享资源变得更加安全,但同时也意味着任意事件回调处理的阻塞都将阻塞后面的所有事件,所以需要留意回调函数内部代码的阻塞问题。Emx中出现的所有需要绑定EuvLoop的回调函数都需要注意这个问题,例如异步实时流获取,SD卡状态回调等等。