boost::io_service解读
asio是boost提供的一个c++异步编程模型库,其核心类io_service,在多线程编程里面提供了任务队列和任务分发功能,在socket、io编程里主要作为一个事件驱动器(完成端口、select、poll、epoll等)。
队列模型
每个io_service都一个公有任务队列,和多个私有任务队列,公有队列由各个线程共享,私有队列则是每个线程独享一个。
io_service的任务执行流程大致如下:
- 调用run方法,进入主loop;
- 判断公有队列是否为空,不为空则取出任务并执行,当任务数大于1时同时唤醒其他空闲线程;
- 任务执行结束,把各个线程的私有队里面的任务移动到公有任务队列里面;
- 触发reactor,linux下面一般是epoll,当有事件时,把相应的事件的任务放到私有队列里。
- 当队列为空时,把当前线程加到空闲线程队列里面,同时进入wait状态,等待其他线程的唤醒(task_operation)。
- 当用户调用post时,任务是直接投递到公有队列op_queue里面。
线程池模型
常用的线程池模型有两种:
一种是多个线程共享一个任务队列,用户把任务投递到该任务队列中,其他线程竞争从该队列中获取任务执行。结合boost::thread,在多个线程里面调用r