摘要
等那隻乳牛。
宣告
#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
) 結束後喚醒執行緒。期限可能會根據工作的計時器封包政策自動調整。
冒牌水煙
使用 Futexe 的元件應準備處理錯誤的喚醒。錯誤喚醒是指 zx_futex_wait()
成功回傳,即使元件並未透過呼叫 zx_futex_wake()
喚醒等候程序也一樣。
Zircon 的 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 的等候人員。
- 尚未開始 new_futex_owner。
ZX_ERR_BAD_HANDLE
new_futex_owner 不是 ZX_HANDLE_INVALID
,而是有效的控制代碼,且當前_值與 value_ptr 的值相符
ZX_ERR_WRONG_TYPE
new_futex_owner 是有效的控制代碼,但不是執行緒的控制代碼。
ZX_ERR_BAD_STATE
current_value與 current_value 的值不相符。
ZX_ERR_TIMED_OUT
執行緒在期限前並未喚醒執行緒。