1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2024-12-02 11:03:18 +02:00

Update example.md (#257)

Adding a possible solution to the example that
does not compile. The solution includes notes
with important parts.
This commit is contained in:
Igor Petruk 2023-01-24 14:25:18 +00:00 committed by GitHub
parent 10ca7b1b2d
commit b12a1cb320
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -17,3 +17,43 @@ fn main() {
println!("v: {v:?}");
}
```
<details>
Possible solution:
```rust,editable
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let v = Arc::new(Mutex::new(vec![10, 20, 30]));
let v2 = v.clone();
let handle = thread::spawn(move || {
let mut v2 = v2.lock().unwrap();
v2.push(10);
});
{
let mut v = v.lock().unwrap();
v.push(1000);
}
handle.join().unwrap();
{
let v = v.lock().unwrap();
println!("v: {v:?}");
}
}
```
Notable parts:
* `v` is wrapped in both `Arc` and `Mutex`, because their concerns are orthogonal.
* `v: Arc<_>` needs to be cloned as `v2` before it can be moved into another thread. Note `move` was added to the lambda signature.
* Blocks are introduced to narrow the scope of the `LockGuard` as much as possible.
* We still need to acquire the `Mutex` to print our `Vec`.
</details>