摘要
写入 futex、唤醒 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()
会执行一系列以下 4 项操作:
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()
或任何其他调用无效。
如果有任何操作失败,则线程会采用 trap(就好像被 __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()