gozfree / gear-lib

Gear-Lib, C library for IOT Embedded Multimedia and Network
MIT License
2.97k stars 805 forks source link

关于workq库的疑问 #75

Closed Kelephant closed 2 years ago

Kelephant commented 2 years ago

static struct workq *find_idle_workq(struct workq_pool *pool) { int i; struct workq *wq; for (i = 0; i < pool->wq_array.num; i++) { wq = pool->wq_array.array[pool->wq_array.num-1]; if (wq->load == 0 || wq->load < pool->threshold) break; } return pool->wq_array.array[i]; } wq = pool->wq_array.array[pool->wq_array.num-1] 这一个我不太理解。 假设wq_array在pool创建后就已经确定大小,那么wq_array 的num也是确定的,这里的将最后一个wq_array一直赋值给wq,意味着wq的值在这个循环里面就没有改变过,是不是有问题呢?

是否应该改为wq = pool->wq_array.array[pool->wq_array.num-i];

gozfree commented 2 years ago

hi Kelephant,这里数组下标确实不该用[pool->wq_array.num-1],只是造成的结果是所有的task全部push到最后一个workq的list_head上了,任务还是会执行到,没有达到期望的负载均衡的效果,已提交修复patch。 不过所谓”负载均衡“,实现可简单可复杂,是个开发性话题,这里由于没有做服务端的强需求,所有负载均衡算法还没支持,可以深挖linux kernel的workqueue的实现。 感谢你的意见

Kelephant commented 2 years ago

@gozfree 好,谢谢