blob: be25899872e77e95df442fd166726dc7233e8d67 [file] [log] [blame] [view]
# 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