ExecutionQueue是一个多生产者-单消费者模型的工作队列,特性:
- wait-free,基于butex同步
- 队列元素数量无边界
- 没有daemon thread存在,消费者线程自动启动、自动销毁。当有任务加入队列,启动一个bthread持续消费队列并执行任务,直到队列为空,销毁这个bthread
- 提供有序性和优先级管理,高优先级任务先于低优先级任务执行,相同优先级内部任务按照FIFO顺序执行。高优先级任务不是即时抢占的,即若当前正在执行低优先级任务,那么高优先级任务插入不会抢占低优先级任务立刻执行,而且会等待这个低优先级任务执行完成后再启动,即高优先级任务最多延迟一个任务调度
- 用户类型T必须支持拷贝构造
源码位置 bthread/execution_queue.h bthread/execution_queue_inl.h bthread/execution_queue.cpp
wait-free实现
ExecutionQueue中每个任务包装在一个TaskNode中,ExecutionQueue中维护一个单链表表头,所有任务通过next指针连接在这个链表中。每次新增任务从head加入,只有头节点有执行任务的权利,头节点添加者启动一个bthread遍历所有TaskNode链表直到所有任务执行完毕,如图:
执行过程后不断有新任务加入,如图:
之前有4个任务,任务1是头节点,将链表反序后顺序执行,本次执行完1,2,3,4任务,此时有新增任务5,6加入,继续执行,直到没有新加入节点为止
业务调用start_execute执行一个任务,伪代码如下:
|