2013-03-24 29 views
2

如果complete_all()会发生什么叫做完成对象(从任务B)的任务A得到做完成对象wait_for_completion()过吗?是否有一些API可以在等待时立即找到对象并立即返回?一种方法可能是使用在发送消息之前锁定的mutex,并在等待之前解锁。这个锁需要在complete_all()之前获得,并在之后发布,但是想知道是否有更清洁/更好的方法。任何想法都欢迎。完成目标的竞争条件

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

+1

内核已经处理这种情况afair。 – 2013-03-24 15:36:01

回答

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