Вы можете передавать значения между потоками, используя mpsc
канал.
Пока вы не пометите свой thread::spawn
ключевым словом move
, например:
thread::spawn(move || {});
Так как выне пометил его ключевым словом move, тогда внешние переменные не перемещаются в область потока, а только делятся своими ссылками.Таким образом, вам нужно реализовать Sync
признак, который каждая внешняя переменная, которую вы используете.
mpsc::Sender
не реализует Sync
, поэтому вы получаете ошибку, которая не может быть разделена между потоками.
Решение для вашего случая было бы идеальным, чтобы переместить отправителя внутрь области потока с помощью перемещения следующим образом:
use std::collections::HashMap;
use std::sync::mpsc;
use std::sync::Arc;
use std::sync::Mutex;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let _ = tx.send(worker());
});
let arc = rx.recv().unwrap();
let hashmap_guard = arc.lock().unwrap();
print!(
"HashMap that retrieved from thread : {:?}",
hashmap_guard.get("Hello").unwrap()
);
}
fn worker() -> Arc<Mutex<HashMap<String, i32>>> {
let mut result: HashMap<String, i32> = HashMap::new();
result.insert("Hello".to_string(), 2);
// some computation
Arc::new(Mutex::new(result))
}
Детская площадка
Для получения дополнительной информации: Iрекомендую прочитать Язык программирования Rust , в частности главу по параллелизму .В нем вы познакомитесь с Arc
: особенно если вы хотите поделиться своими данными между потоками.