摘要
寫入 futex, 醒來模糊, 關閉控點, 結束。
宣告
#include <zircon/syscalls.h>
[[noreturn]] void zx_futex_wake_handle_close_thread_exit(
const zx_futex_t* value_ptr,
uint32_t wake_count,
int32_t new_value,
zx_handle_t close_handle);
說明
zx_futex_wake_handle_close_thread_exit()
會執行四項作業:
atomic_store_explicit(value_ptr, new_value, memory_order_release);
zx_futex_wake(value_ptr, wake_count);
zx_handle_close(close_handle);
zx_thread_exit();
預期在第一項作業完成後,其他執行緒就可能會取消對應,或重複使用含有呼叫執行緒專屬堆疊的記憶體。這對於這個呼叫有效,但對於純 zx_futex_wake()
或任何其他呼叫而言無效。
如有任何作業失敗,執行緒就會進行抓取 (就像由 __builtin_trap();
執行一樣)。
權限
TODO(https://fxbug.dev/42107318)
傳回值
zx_futex_wake_handle_close_thread_exit()
不會傳回。
錯誤
無。
附註
這個問題的預期用途是讓執行緒在等待其他執行緒收到作業完成、關閉其自己的執行緒控制代碼,然後結束。無法事先關閉執行緒控點,因為關閉執行緒的最後一個控制代碼會終止該執行緒。不能在這項呼叫之前完成對 value_ptr 的寫入,因為彙整執行緒可能會在寫入後隨時重複使用或取消分配此執行緒的堆疊,導致對這個函式的呼叫慣例造成問題。
這項呼叫用於可彙整的執行緒,而 zx_vmar_unmap_handle_close_thread_exit()
則用於卸離的執行緒。
另請參閱
- futex 物件
zx_futex_wake()
zx_handle_close()
zx_thread_exit()
zx_vmar_unmap_handle_close_thread_exit()