2

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

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

4

1 回答 1

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()设置doneUINT_MAX / 2(实际上是无穷大)并唤醒睡在wait_for_completion().

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

于 2013-03-26T17:40:48.157 回答