---
minutes: 13
---

# Scoped Threads

Normal threads cannot borrow from their environment:

```rust,editable,compile_fail
use std::thread;

fn foo() {
    let s = String::from("Hello");
    thread::spawn(|| {
        dbg!(s.len());
    });
}

fn main() {
    foo();
}
```

However, you can use a [scoped thread][1] for this:

```rust,editable
use std::thread;

fn foo() {
    let s = String::from("Hello");
    thread::scope(|scope| {
        scope.spawn(|| {
            dbg!(s.len());
        });
    });
}

fn main() {
    foo();
}
```

[1]: https://doc.rust-lang.org/std/thread/fn.scope.html

<details>

- The reason for that is that when the `thread::scope` function completes, all
  the threads are guaranteed to be joined, so they can return borrowed data.
- Normal Rust borrowing rules apply: you can either borrow mutably by one
  thread, or immutably by any number of threads.

</details>
