zxfutex_wait

摘要

等一下 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_ownerZX_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_valuevalue_ptr 中的值匹配

ZX_ERR_WRONG_TYPE new_futex_owner 是一个有效的句柄,但不是线程的句柄。

ZX_ERR_BAD_STATE current_valuevalue_ptr 中的值不匹配。

ZX_ERR_TIMED_OUT截止期限过去之前,线程未唤醒。

另请参阅