mirror of https://github.com/WebAssembly/wasi-sdk
Document how to use coop threads (#654)
This is all off-by-default right now but the distribution supports this through a separate sysroot. Document what's going on for others to discover.pull/453/merge
parent
06d2eb431b
commit
7aebf56a21
@ -0,0 +1,46 @@
|
||||
# Support for Cooperative Threading
|
||||
|
||||
The component model specification is in the process of adding and defining
|
||||
intrinsics for guests to use to implement cooperative multithreading. The goal
|
||||
of this effort is to enable compiling applications using `pthread_*` style
|
||||
threading APIs, for example, to work with components. These intrinsics are
|
||||
described in the [component model explainer][explain] and this feature
|
||||
corresponds to the 🧵 emoji. The Wasmtime runtime supports this proposal behind
|
||||
the `-Wcomponent-model-threading` flag.
|
||||
|
||||
[explain]: https://github.com/WebAssembly/component-model/blob/main/design/mvp/Explainer.md
|
||||
|
||||
Due to this feature being experimental and not officially included in any
|
||||
published WASI version yet it is off-by-default in wasi-sdk. By default
|
||||
`pthread_*`-style APIs either return an error (such as when spawning a thread)
|
||||
or trap (such as when blocking on a condition variable). Note that for
|
||||
compatibility, though, all `pthread_*` APIs are always available. The wasi-sdk
|
||||
distribution, however, does enable effectively swapping out these
|
||||
implementations in an opt-in basis to test out cooperative multithreading.
|
||||
|
||||
Assuming that you've downloaded wasi-sdk and unpacked it within `$WASI_SDK_PATH`
|
||||
there is a sysroot located at `$WASI_SDK_PATH/share/wasi-sysroot/experimental-coop-threads`
|
||||
which can be used to experiment with cooperative multithreading. You can use
|
||||
this in your project like so:
|
||||
|
||||
```console
|
||||
$WASI_SDK_PATH/bin/wasm32-wasip3-clang foo.c -o foo.wasm --sysroot \
|
||||
$WASI_SDK_PATH/share/wasi-sysroot/experimental-coop-threads -pthread
|
||||
```
|
||||
|
||||
Note the `--sysroot` and `-pthread` flags to indicate that threading is being
|
||||
used. When combined these flags should produce a binary which can then be run in
|
||||
Wasmtime, for example, like so:
|
||||
|
||||
```console
|
||||
wasmtime -W component-model-threading ./foo.wasm
|
||||
```
|
||||
|
||||
The alternative sysroot has support for `pthread_*` symbols in wasi-libc which
|
||||
additionally means support in C++ through the `<thread>` header, for example.
|
||||
|
||||
It is intended in the near-ish future (before the end of 2026) that this
|
||||
experimental sysroot will become the default and wasi-libc/wasi-sdk will support
|
||||
cooperative multithreading by default. This decision will require the WASI
|
||||
subgroup to vote on including the cooperative multithreading feature in a future
|
||||
WASI release, and then wasi-libc/wasi-sdk will update to this release.
|
||||
Loading…
Reference in new issue