摘要
喚醒一些等待後期的執行緒,並將更多等候程式移到其他等待佇列。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_futex_requeue(const zx_futex_t* value_ptr,
uint32_t wake_count,
zx_futex_t current_value,
const zx_futex_t* requeue_ptr,
uint32_t requeue_count,
zx_handle_t new_requeue_owner);
說明
「回條」是指醒來的一般化過程。首先,核心驗證
current_value 中的值與
value_ptr,如果未回報 ZX_ERR_BAD_STATE
。喚醒 wake_count 後
執行緒,requeue_count 執行緒會從原始 Futex 的
等待排入與 requeue_ptr 相對應的等待佇列,另一個
CANNOT TRANSLATE
這種重新排入佇列的行為也可以用來避免在醒來時雷霆。
擁有權
重新佇列作業會指定兩個 Futexe,分別是喚醒 futex 和重新佇列 「futex」。我們會分別說明兩者的擁有權影響。 一般來說,如果因任何原因導致呼叫失敗, 做出毛茸茸的
請參閱 futex 的「擁有權和優先順序沿用」一節, 詳細資料。
對喚醒 futex 目標的影響
成功呼叫 zx_futex_requeue()
會導致 Futex 的擁有者
不設定任何值,無論喚醒計數為何。為了轉移
因此,請改用 zx_futex_requeue_single_owner()
子類。
zx_futex_requeue_single_owner()
會嘗試從
後續排隊等待佇列如果至少有一個執行緒要喚醒,則 Futex 的擁有者會
切換到喚醒的執行緒。否則就是毛線球
不會有擁有者。
對重新佇列 futex 目標的影響
成功呼叫 zx_futex_requeue()
或 zx_futex_requeue_single_owner()
如此一來,futex 的擁有者就會設為
new_requeue_owner 控制代碼,或是 new_requeue_owner 時不執行任何動作
ZX_HANDLE_INVALID
。
權限
無。
傳回值
zx_futex_requeue()
會在成功時傳回 ZX_OK
。
錯誤
ZX_ERR_INVALID_ARGS
符合下列其中一項條件:
- value_ptr 或 requeue_ptr 不是有效的使用者空間指標
- value_ptr 或 requeue_ptr 沒有與
sizeof(zx_futex_t)
邊界對齊。 - value_ptr 與 requeue_ptr 相同
- new_requeue_owner 目前是 value_ptr 或 requeue_ptr 等候者的成員
- 尚未啟動 new_requeue_owner。
ZX_ERR_BAD_HANDLE
new_requeue_owner 不是 ZX_HANDLE_INVALID
,也不是有效的帳號代碼「和」
current_value 與 value_ptr 的值相符
ZX_ERR_WRONG_TYPE
new_requeue_owner 是有效的帳號代碼,但不是執行緒的控制代碼。
ZX_ERR_BAD_STATE
current_value 與 value_ptr 的值不符。