如果在任务A 上执行complete_all()
之前在完成对象(来自任务B )上调用wait_for_completion()
会发生什么情况完成对象?是否有一些API可以在等待时找到对象已经完成并立即返回?一种方法可能是使用mutex
,它在发送消息之前被锁定并在等待之前解锁。这个锁需要在complete_all()
之前获得并在之后发布但是想知道是否有更清洁/更好的方法。欢迎任何想法。
更多上下文: 任务A 初始化完成对象,向任务B 发送请求以及完成对象的地址,然后等待完成。 任务B 在获取消息时执行一些处理,然后在完成对象上执行complete_all()
。
答案 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
螺旋锁已经同步计数器访问权限,以便正确处理您担心的情况。