zx_futex_requeue

摘要

喚醒一些等待後期的執行緒,並將更多等候程式移到其他等待佇列。

宣告

#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_ptrrequeue_ptr 不是有效的使用者空間指標
  • value_ptrrequeue_ptr 沒有與 sizeof(zx_futex_t) 邊界對齊。
  • value_ptrrequeue_ptr 相同
  • new_requeue_owner 目前是 value_ptrrequeue_ptr 等候者的成員
  • 尚未啟動 new_requeue_owner

ZX_ERR_BAD_HANDLE new_requeue_owner 不是 ZX_HANDLE_INVALID,也不是有效的帳號代碼「和」 current_valuevalue_ptr 的值相符

ZX_ERR_WRONG_TYPE new_requeue_owner 是有效的帳號代碼,但不是執行緒的控制代碼。

ZX_ERR_BAD_STATE current_valuevalue_ptr 的值不符。

另請參閱