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()); // соединение потоков с главным.
    }                                // и вывод результата каждого потока.