zx_thread_start


英文原文快照


名称

thread_start —— 新线程开始执行

概要

  1. #include <zircon/syscalls.h>
  2. zx_status_t zx_thread_start(zx_handle_t handle, zx_vaddr_t entry, zx_vaddr_t stack,
  3. uintptr_t arg1, uintptr_t arg2);

描述

thread_start() 触发线程在entry指定的程序计数器处开始执行,并且将堆栈指针设置为stack。 参数arg1arg2被放置在体系结构相关的寄存器中,用于在线程启动之前的函数调用的前两个参数。 其他所有寄存器在启动时均置为零。

当线程的最后一个句柄关闭时,线程将被销毁。

线程句柄可以被等待,并在线程停止执行时(由于thread_exit() 被调用)发出ZX_THREAD_TERMINATED信号。

entry所指向的函数,必须在到达最后一条指令之前调用thread_exit()futex_wake_handle_close_thread_exit()vmar_unmap_handle_close_thread_exit()。 例如下面的例子:

  1. void thread_entry(uintptr_t arg1, uintptr_t arg2) __attribute__((noreturn)) {
  2. // 在这里进行一些操作
  3. // ……
  4. zx_thread_exit();
  5. }

在函数结束之前(最后一条代码)未能调用上述其中一个退出函数将导致抛出体系结构/工具链特定的异常。

权限

TODO(ZX-2399)

返回值

thread_start() 调用成功则返回ZX_OK。 如果调用失败,则返回负的错误码。

错误码

ZX_ERR_BAD_HANDLEthread是无效句柄。

ZX_ERR_WRONG_TYPEthread不是线程类型的句柄。

ZX_ERR_ACCESS_DENIEDthread缺少ZX_RIGHT_WRITE权限。

ZX_ERR_BAD_STATEthread未处于准备运行状态或thread不再处于存活状态。

另见

handle_close, handle_duplicate, object_wait_one, object_wait_many, thread_create, thread_exit, futex_wake_handle_close_thread_exit, vmar_unmap_handle_close_thread_exit.