zx_thread_start
名称
thread_start —— 新线程开始执行
概要
#include <zircon/syscalls.h>
zx_status_t zx_thread_start(zx_handle_t handle, zx_vaddr_t entry, zx_vaddr_t stack,
uintptr_t arg1, uintptr_t arg2);
描述
thread_start() 触发线程在entry指定的程序计数器处开始执行,并且将堆栈指针设置为stack。 参数arg1和arg2被放置在体系结构相关的寄存器中,用于在线程启动之前的函数调用的前两个参数。 其他所有寄存器在启动时均置为零。
当线程的最后一个句柄关闭时,线程将被销毁。
线程句柄可以被等待,并在线程停止执行时(由于thread_exit() 被调用)发出ZX_THREAD_TERMINATED信号。
entry所指向的函数,必须在到达最后一条指令之前调用thread_exit(),futex_wake_handle_close_thread_exit() 或vmar_unmap_handle_close_thread_exit()。 例如下面的例子:
void thread_entry(uintptr_t arg1, uintptr_t arg2) __attribute__((noreturn)) {
// 在这里进行一些操作
// ……
zx_thread_exit();
}
在函数结束之前(最后一条代码)未能调用上述其中一个退出函数将导致抛出体系结构/工具链特定的异常。
权限
TODO(ZX-2399)
返回值
thread_start() 调用成功则返回ZX_OK。 如果调用失败,则返回负的错误码。
错误码
ZX_ERR_BAD_HANDLE:thread是无效句柄。
ZX_ERR_WRONG_TYPE:thread不是线程类型的句柄。
ZX_ERR_ACCESS_DENIED:thread缺少ZX_RIGHT_WRITE权限。
ZX_ERR_BAD_STATE:thread未处于准备运行状态或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.