Threads
Создание
Потоки - объект ОС, способ разделения работы ПО. На обработку потоков могут назначаться разные ядра, а могут и не назначаться. Потоки выгодно использовать тогда, когда они дают выигрыш во времени больше, чем время на их создание (на x86 процессорах = ~9000 наносек, на ARM процессорах = ~27000 наносек). Обычно, это интенсивные по вычислениям приложения. Для интенсивным по вводу-выводу приложений следует использовать async/await вместо потоков.
Пример создания:
fn hello_thread() {
println!("Hello from thread")
}
fn main() {
println!("Hello from the MAIN thread");
let thread_handle = std::thread::spawn(hello_thread);
thread_handle.join().unwrap(); // нужно соединить новый поток с главным
// потоком программы, иначе он может не успеть вернуть данные до
// завершения главного потока программы
}
Потоки являются владельцами данных, поэтому нужно передавать им данные перемещением, чтобы они были живы к моменту запуска потока:
fn do_math(i: u32) -> u32 {
let mut n = i + 1;
for _ in 0..10 {
n *= 2;
}
n
}
fn main() {
println!("Hello from the MAIN thread");
let mut thread_handles = Vec::new(); // вектор указателей потоков
for i in 0..10 {
let thread_handle = std::thread::spawn(move || do_math(i));
thread_handles.push(thread_handle); // добавить поток к вектор
}
for h in thread_handles.into_iter() {
println!("{}", h.join().unwrap()); // соединение потоков с главным.
} // и вывод результата каждого потока.