| # 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. | |
| ### Signals | |
| Threads provide the following signals: | |
| + `ZX_THREAD_TERMINATED` | |
| + `ZX_THREAD_SUSPENDED` | |
| + `ZX_THREAD_RUNNING` | |
| When a thread is started `ZX_THREAD_RUNNING` is asserted. When it is suspended | |
| `ZX_THREAD_RUNNING` is deasserted, and `ZX_THREAD_SUSPENDED` is asserted. When | |
| the thread is resumed `ZX_THREAD_SUSPENDED` is deasserted and | |
| `ZX_THREAD_RUNNING` is asserted. When a thread terminates both | |
| `ZX_THREAD_RUNNING` and `ZX_THREAD_SUSPENDED` are deasserted and | |
| `ZX_THREAD_TERMINATED` is asserted. | |
| Note that signals are OR'd into the state maintained by the | |
| [`zx_object_wait_*()`](/docs/reference/syscalls/object_wait_one.md) family of functions thus | |
| you may see any combination of requested signals when they return. | |
| ## SYSCALLS | |
| - [`zx_thread_create()`] - create a new thread within a process | |
| - [`zx_thread_exit()`] - exit the current thread | |
| - [`zx_thread_read_state()`] - read register state from a thread | |
| - [`zx_thread_start()`] - cause a new thread to start executing | |
| - [`zx_thread_write_state()`] - modify register state of a thread | |
| <br> | |
| - [`zx_task_create_exception_channel()`] - listen for task exceptions | |
| - [`zx_task_kill()`] - cause a task to stop running | |
| [`zx_futex_wake_handle_close_thread_exit()`]: /docs/reference/syscalls/futex_wake_handle_close_thread_exit.md | |
| [`zx_object_get_child()`]: /docs/reference/syscalls/object_get_child.md | |
| [`zx_process_start()`]: /docs/reference/syscalls/process_start.md | |
| [`zx_task_create_exception_channel()`]: /docs/reference/syscalls/task_create_exception_channel.md | |
| [`zx_task_kill()`]: /docs/reference/syscalls/task_kill.md | |
| [`zx_thread_create()`]: /docs/reference/syscalls/thread_create.md | |
| [`zx_thread_exit()`]: /docs/reference/syscalls/thread_exit.md | |
| [`zx_thread_read_state()`]: /docs/reference/syscalls/thread_read_state.md | |
| [`zx_thread_write_state()`]: /docs/reference/syscalls/thread_write_state.md | |
| [`zx_thread_start()`]: /docs/reference/syscalls/thread_start.md | |
| [`zx_vmar_unmap_handle_close_thread_exit()`]: /docs/reference/syscalls/vmar_unmap_handle_close_thread_exit.md |