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执行一个任务,伪代码如下:
|
|
通过exchange保证了wait-fre

本文详细分析了bthread的ExecutionQueue,这是一个多生产者-单消费者工作队列,特点是wait-free同步,无边界队列大小,自动启动和销毁消费者线程。队列提供有序性和优先级管理,并确保高优先级任务在低优先级任务完成后执行。文章探讨了wait-free实现机制,以及ExecutionQueue的生命周期管理,包括版本号和引用计数在资源池中的作用。
最低0.47元/天 解锁文章
920

被折叠的 条评论
为什么被折叠?



