# Thread ## NAME thread - runnable / computation entity ## SYNOPSIS TODO ## DESCRIPTION The thread object is the construct that represents a time-shared CPU execution context. Thread objects live associated to a particular [Process Object](process.md) which provides the memory and the handles to other objects necessary for I/O and computation. ### Lifetime Threads are created by calling `zx_thread_create()`, but only start executing when either `zx_thread_start()` or `zx_process_start()` are called. Both syscalls take as an argument the entrypoint of the initial routine to execute. The thread passed to `zx_process_start()` should be the first thread to start execution on a process. A thread terminates execution: + by calling `zx_thread_exit()` + by calling `zx_vmar_unmap_handle_close_thread_exit()` + by calling `zx_futex_wake_handle_close_thread_exit()` + when the parent process terminates + by calling `zx_task_kill()` with the thread's handle + after generating an exception for which there is no handler or the handler decides to terminate the thread. Returning from the entrypoint routine does not terminate execution. The last action of the entrypoint should be to call `zx_thread_exit()` or one of the above mentioned `_exit()` variants. Closing the last handle to a thread does not terminate execution. In order to forcefully kill a thread for which there is no available handle, use `zx_object_get_child()` to obtain a handle to the thread. This method is strongly discouraged. Killing a thread that is executing might leave the process in a corrupt state. Fuchsia native threads are always *detached*. That is, there is no *join()* operation needed to do a clean termination. However, some runtimes above the kernel, such as C11 or POSIX might require threads to be joined. ## SYSCALLS + [thread_create](../syscalls/thread_create.md) - create a new thread within a process + [thread_exit](../syscalls/thread_exit.md) - exit the current thread + [thread_read_state](../syscalls/thread_read_state.md) - read register state from a thread + [thread_start](../syscalls/thread_start.md) - cause a new thread to start executing + [thread_write_state](../syscalls/thread_write_state.md) - modify register state of a thread
+ [task_resume](../syscalls/task_resume.md) - cause a suspended task to continue running + [task_bind_exception_port](../syscalls/task_bind_exception_port.md) - attach an exception port to a task + [task_kill](../syscalls/task_kill.md) - cause a task to stop running