69,336
社区成员
发帖
与我相关
我的任务
分享
// 大概结构也就这样
#define PRI_NUM 3
// 优先级
#define PRI_LOW 0
#define PRI_NORMAL 1
#define PRI_HIGH 2
struct task_queue {
int cur_max_pri; // 当前队列中存在的最大优先 (其实是为了让整个 push 与 pop 过程尽量达到 O1)
int count; // 队中的task 数量, (只要应用于实现水位控制)
task_list_t *tls[PRI_NUM]; // 链表数组
// ...
// ...
} task_queue_t;
// ...
// task_queue * task_queue_create();
// void task_queue_release(task_queue_t *tq);
// @pri 优先权,即 PRI_LOW, PRI_NORMAL, PRI_HIGH
void task_queue_push(task_queue_t *tq, task_t *t, int pri)
{
// 维护 cur_max_pri;
if (pri > tq->cur_max_pri) tq->int cur_max_pri = pri;
task_list_push_tail(tq->tsl[pri], t);
// ...
}
task_t * task_queue_pop(task_queue_t *tq)
{
// 获取当前优先级最大的 list
// 从list 中 pop 一个 task
task_list_t * tl = tq->tls[tq->cur_max_pri];
// ...
task_t *res = task_list_pop(tl);
// 维护 cur_max_pri;
// 如果 tq->tls[tq->cur_max_pri] == NULL, 则降级.
// while (tq->cur_max_pri == NULL && 0 < tq->cur_max_pri) --tq->cur_max_pri;
// ..
return res;
}
总体就是 用优先级来做数组的下标