diff --git a/book/en/src/by-example/resources.md b/book/en/src/by-example/resources.md index 6426913289..9d51d6c97a 100644 --- a/book/en/src/by-example/resources.md +++ b/book/en/src/by-example/resources.md @@ -30,6 +30,11 @@ task. Thus, a task `#[local]` resource can only be accessed by one singular task. Attempting to assign the same `#[local]` resource to more than one task is a compile-time error. +Types of `#[local]` resources must implement [`Send`] trait as they are being sent from `init` +to target task and thus crossing the thread boundary. + +[`Send`]: https://doc.rust-lang.org/stable/core/marker/trait.Send.html + The example application shown below contains two tasks where each task has access to its own `#[local]` resource, plus that the `idle` task has its own `#[local]` as well. @@ -51,6 +56,11 @@ A special use-case of local resources are the ones specified directly in the res initialized in `#[init]`. Moreover, local resources in `#[init]` and `#[idle]` have `'static` lifetimes, this is safe since both are not re-entrant. +Types of `#[task(local = [..])]` resources have to be neither [`Send`] nor [`Sync`] as they +are not crossing any thread boundary. + +[`Sync`]: https://doc.rust-lang.org/stable/core/marker/trait.Sync.html + In the example below the different uses and lifetimes are shown: ``` rust @@ -95,6 +105,8 @@ $ cargo run --target thumbv7m-none-eabi --example lock {{#include ../../../../ci/expected/lock.run}} ``` +Types of `#[shared]` resources have to be both [`Send`] and [`Sync`]. + ## Multi-lock As an extension to `lock`, and to reduce rightward drift, locks can be taken as tuples. The