zx_futex_wake_handle_close_thread_exit


英文原文快照


名称

futex_wake_handle_close_thread_exit —— 原子地写入futex,唤醒futex,关闭相关的句柄,并退出线程。

概要

  1. #include <zircon/syscalls.h>
  2. _Noreturn void zx_futex_wake_handle_close_thread_exit(
  3. const zx_futex_t* value_ptr, uint32_t wake_count,
  4. int new_value, zx_handle_t close_handle);

描述

futex_wake_handle_close_thread_exit() 依次执行以下四个操作:

  1. atomic_store_explicit(value_ptr, new_value, memory_order_release);
  2. zx_futex_wake(value_ptr, wake_count);
  3. zx_handle_close(close_handle);
  4. 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_wakehandle_closethread_exitvmar_unmap_handle_close_thread_exit