zx_futex_wake_handle_close_thread_exit
名称
futex_wake_handle_close_thread_exit —— 原子地写入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,
int new_value, zx_handle_t close_handle);
描述
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();
设计目的是在上述第一个操作完成后,其他线程可以取消映射(unmap)或重用包含调用线程的堆栈内存。因此仅对于此调用有效,而对于zx_futex_wake() 等其他调用无效。
如果其中任何操作失败,那么该线程会产生一次“自陷”效果(就像__builtin_trap();
一样)。
权限
TODO(ZX-2399)
返回值
futex_wake_handle_close_thread_exit() 不再返回
错误码
无
注释
该系统调用目的的是让一个将结束线程,提醒另一个线程等待它的结束,并关闭自己的线程句柄,然后退出。线程句柄不能事先被关闭,因为关闭线程的最后一个句柄会直接杀死该线程。在该调用之前无法写入value_ptr
,因为在写入之后的任何时候,某个可结合线程可能会重用或解分配此线程的堆栈,进而导致在进入此函数的调用约定上产生问题。
此调用仅用于可结合(joinable)线程,而对于分离(detached)线程请使用vmar_unmap_handle_close_thread_exit()。
另见
futex_wake,handle_close,thread_exit,vmar_unmap_handle_close_thread_exit。