总结
等等等等。
声明
#include <zircon/syscalls.h>
zx_status_t zx_futex_wait(const zx_futex_t* value_ptr,
zx_futex_t current_value,
zx_handle_t new_futex_owner,
zx_time_t deadline);
说明
zx_futex_wait()
以原子方式验证 value_ptr 仍包含值 current_value,并处于休眠状态,直到通过调用 zx_futex_wake
获得 futex。您还可以选择在截止时间(相对于 ZX_CLOCK_MONOTONIC
)过后唤醒线程。系统可根据作业的计时器空闲时间政策自动调整截止时间。
唤醒
使用 futex 的组件应该准备好处理虚假唤醒。假唤醒是指即使组件未通过调用 zx_futex_wake()
唤醒 Waiter,zx_futex_wait()
也会成功返回。
Zircon 的 futex 实现目前不会自行生成虚假唤醒。但是,使用 futex 的常用算法有时可能会产生虚假唤醒。例如,mutex_unlock
的常规实现可能会在某个内存位置释放该位置并将其重复用于不相关的目的后,对该位置产生一次 zx_futex_wake()
调用。
所有权
如果成功调用 zx_futex_wait()
,会导致 futex 的所有者被设置为 new_futex_owner 句柄引用的线程;如果 new_futex_owner 为 ZX_HANDLE_INVALID
,则不设置任何值。
如需了解详情,请参阅 futex 中的所有权和优先级继承。
权限
无。
返回值
zx_futex_wait()
会在成功时返回 ZX_OK
。
错误
ZX_ERR_INVALID_ARGS
以下情况之一为 true:
- value_ptr 不是有效的用户空间指针
- value_ptr 未与
sizeof(zx_futex_t)
边界对齐。 - new_futex_owner 当前是 value_ptr 的 Waiter 成员。
- new_futex_owner 尚未启动。
ZX_ERR_BAD_HANDLE
new_futex_owner 不是 ZX_HANDLE_INVALID
,不是有效的句柄,并且 current_value 与 value_ptr 中的值匹配
ZX_ERR_WRONG_TYPE
new_futex_owner 是有效的句柄,但不是线程的句柄。
ZX_ERR_BAD_STATE
current_value 与 value_ptr 中的值不匹配。
ZX_ERR_TIMED_OUT
线程在 deadline 过去之前未被唤醒。