完成对象竞争条件

时间:2013-03-24 06:18:26

标签: linux-kernel

如果在任务A 上执行complete_all()之前在完成对象(来自任务B )上调用wait_for_completion()会发生什么情况完成对象?是否有一些API可以在等待时找到对象已经完成并立即返回?一种方法可能是使用mutex,它在发送消息之前被锁定并在等待之前解锁。这个锁需要在complete_all()之前获得并在之后发布但是想知道是否有更清洁/更好的方法。欢迎任何想法。

更多上下文: 任务A 初始化完成对象,向任务B 发送请求以及完成对象的地址,然后等待完成。 任务B 在获取消息时执行一些处理,然后在完成对象上执行complete_all()

1 个答案:

答案 0 :(得分:2)

如果在complete()之前为特定完成对象调用complete_all()wait_for_completion(),则wait_for_completion()将立即返回。完成对象大致类似于信号量:

  • 在内部,完成对象的done计数器初始化为0。

  • wait_for_completion()一直待到done > 0(如果done已经大于0,则立即进行),并在返回前以原子方式递减done

  • complete()增加done并唤醒在wait_for_completion()中休眠的第一个进程。

  • complete_all()done设置为UINT_MAX / 2(实际上是无穷大)并唤醒所有睡在wait_for_completion()的人。

因此,如果我正确理解您的问题,则无需额外锁定;完成对象的内部wait.lock螺旋锁已经同步计数器访问权限,以便正确处理您担心的情况。