Пример
Посмотрим Arc и Mutex в действии:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::thread;
// use std::sync::{Arc, Mutex};
fn main() {
let v = vec![10, 20, 30];
let mut handles = Vec::new();
for i in 0..5 {
handles.push(thread::spawn(|| {
v.push(10 * i);
println!("v: {v:?}");
}));
}
handles.into_iter().for_each(|h| h.join().unwrap());
}
This slide should take about 8 minutes.
Возможное решение:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let v = Arc::new(Mutex::new(vec![10, 20, 30]));
let mut handles = Vec::new();
for i in 0..5 {
let v = Arc::clone(&v);
handles.push(thread::spawn(move || {
let mut v = v.lock().unwrap();
v.push(10 * i);
println!("v: {v:?}");
}));
}
handles.into_iter().for_each(|h| h.join().unwrap());
}
Важные моменты:
vобёрнут и вArc, и вMutex, потому что их задачи ортогональны.- Обёртывание
MutexвArc— распространённый паттерн для совместного использования изменяемого состояния между потоками.
- Обёртывание
v: Arc<_>нужно клонировать, чтобы создать новую ссылку для каждого нового порождённого потока. Обратите внимание, что в сигнатуру замыкания добавленоmove.- Введены блоки, чтобы максимально сузить область видимости
LockGuard.