线程线程启动

总结

在线程上开始执行。

声明

#include <zircon/syscalls.h>

zx_status_t zx_thread_start(zx_handle_t handle,
                            zx_vaddr_t thread_entry,
                            zx_vaddr_t stack,
                            uintptr_t arg1,
                            uintptr_t arg2);

说明

zx_thread_start() 会使线程在由 thread_entry 指定的程序计数器处开始执行,并将堆栈指针设置为 stack。参数 arg1arg2 被安排到在线程启动之前用于函数调用的前两个参数的架构专用寄存器。所有其他寄存器在启动时均为零。

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

线程句柄可能会被等待,并在线程停止执行时(由于调用了 zx_thread_exit())断言 ZX_THREAD_TERMINATED 信号。

thread_entry 应指向一个函数,该函数必须在调用 zx_thread_exit()zx_futex_wake_handle_close_thread_exit()zx_vmar_unmap_handle_close_thread_exit() 才能到达最后一个指令。示例如下:

void thread_entry(uintptr_t arg1, uintptr_t arg2) __attribute__((noreturn)) {
  // do work here.

  zx_thread_exit();
}

如果在到达函数末尾之前未能调用某个退出函数,则将导致特定于架构 / 工具链的异常。

权限

handle 必须为 ZX_OBJ_TYPE_THREAD 类型,且具有 ZX_RIGHT_MANAGE_THREAD

返回值

zx_thread_start() 会在成功时返回 ZX_OK。如果失败,则返回负数错误值。

错误

ZX_ERR_BAD_HANDLE 线程不是有效句柄。

ZX_ERR_WRONG_TYPE thread 不是线程句柄。

ZX_ERR_ACCESS_DENIED 句柄 thread 缺少 ZX_RIGHT_WRITE

ZX_ERR_BAD_STATE 线程未准备好运行,或线程所属的进程不再处于活动状态。

ZX_ERR_INVALID_ARGS thread_entry 不是用户空间地址,不是 [规范地址] 或不是 0

另请参阅