你应该如何处理 Parker 的虚假唤醒?
How are you supposed to handle a spurious wakeup of a Parker?
根据 crossbeam::Parker
documentation:
The park method blocks the current thread unless or until the token is available, at which point it automatically consumes the token. It may also return spuriously, without consuming the token.
您应该如何检测是否发生虚假唤醒?在内部,parker 似乎使用原子来跟踪令牌是否已被消耗,但除了 park
和 park_timeout
方法之外,似乎没有办法查询其状态。
你应该以其他方式处理它。例如,如果您手动实施 mpsc 通道,您的 recv
函数可能如下所示:
loop {
if let Some(message) = self.try_recv() {
return message;
}
park();
}
在这种情况下,如果发生虚假 wake-up,循环将再次尝试获取它正在等待的东西,但由于它是虚假的 wake-up,所以该东西不可用,然后循环再次进入休眠状态。一旦 send
实际发生,发送方将取消停放接收方,此时 try_recv
将成功。
这已经 acknowledged as an issue on the relevant GitHub, and a pull request 已提交修复。合并并发布该拉取请求后,我将使用修复问题的版本更新此答案并将此问题标记为已解决。
根据 crossbeam::Parker
documentation:
The park method blocks the current thread unless or until the token is available, at which point it automatically consumes the token. It may also return spuriously, without consuming the token.
您应该如何检测是否发生虚假唤醒?在内部,parker 似乎使用原子来跟踪令牌是否已被消耗,但除了 park
和 park_timeout
方法之外,似乎没有办法查询其状态。
你应该以其他方式处理它。例如,如果您手动实施 mpsc 通道,您的 recv
函数可能如下所示:
loop {
if let Some(message) = self.try_recv() {
return message;
}
park();
}
在这种情况下,如果发生虚假 wake-up,循环将再次尝试获取它正在等待的东西,但由于它是虚假的 wake-up,所以该东西不可用,然后循环再次进入休眠状态。一旦 send
实际发生,发送方将取消停放接收方,此时 try_recv
将成功。
这已经 acknowledged as an issue on the relevant GitHub, and a pull request 已提交修复。合并并发布该拉取请求后,我将使用修复问题的版本更新此答案并将此问题标记为已解决。