void complete_all(struct completion *x)的作用和complete的作用区别在于complete_all
会唤醒在struct completion *x上等待的所有的task,而complete 只能wakeup一个task
其源码分析如下:
void complete_all(struct completion *x)
{
unsigned long flags;
spin_lock_irqsave(&x->wait.lock, flags);
x->done = UINT_MAX;
__wake_up_locked(&x->wait, TASK_NORMAL, 0);
spin_unlock_irqrestore(&x->wait.lock, flags);
}
可以看到x->done 和complete 相比不再执行加1操作,而是直接赋予最大值
然后调用__wake_up_locked,其第三个参数nr 为0 表示wakeup 所有的task。
原因在上一篇博文中已经分析过了。
进程调度API之complete_all
最新推荐文章于 2024-03-12 10:56:10 发布