【问题标题】:Completion object race condition完成对象竞争条件
【发布时间】:2013-03-24 06:18:25
【问题描述】:

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

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

【问题讨论】:

  • 内核已经妥善处理了这种情况。

标签: linux-kernel


【解决方案1】:

如果 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 自旋锁已经同步了计数器访问,以便您担心的情况得到正确处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多