摘要
等一下 Ftex。
声明
#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
。线程也可以在执行完
deadline(关于 ZX_CLOCK_MONOTONIC
)传递。deadline可以是
根据作业的计时器延迟政策自动调整。
无规律的清醒时间
使用 futex 的组件应能够处理虚假
唤醒。虚假唤醒是指 zx_futex_wait()
成功返回,即使组件没有唤醒 Waiter
通过调用 zx_futex_wake()
实现。
Zircon 的 futex 实现目前不会生成
虚假唤醒本身。然而,使用基于文本的常用算法
Futexe 有时可能会生成虚假唤醒。例如,
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
符合以下情况之一:
- 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
在截止期限过去之前,线程未唤醒。