Общие данные

Мьютексы предоставляют доступ к данным из одного потока (за раз)

Mutex - это сокращение от взаимное исключение (mutual exclusion), так как мьютекс позволяет только одному потоку получать доступ к некоторым данным в любой момент времени.

два правила мьютекс:

  • Перед тем как попытаться получить доступ к данным необходимо получить блокировку.
  • Когда вы закончили работу с данными, которые защищает мьютекс, вы должны разблокировать данные, чтобы другие потоки могли получить блокировку.

Mutex<T> API

use std::sync::Mutex; — библиотека

use std::sync::Mutex;

fn main() {
    let m = Mutex::new(5);

    {
        let mut num = m.lock().unwrap();
        *num = 6;
    }

    println!("m = {m:?}");
}

получим m = Mutex { data: 6, poisoned: false, .. }

Разделение Mutex<T> между множеством потоков

#![allow(unused)]
fn main() {
use std::sync::{Arc, Mutex}; //поможет при многопоточности
}
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();

            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *counter.lock().unwrap());
}

Warning

Используя эту стратегию, вы можете разделить вычисления на независимые части, разделить эти части на потоки, а затем использовать Mutex<T>, чтобы каждый поток обновлял конечный результат своей частью кода.

Типажи Sync и Send

в язык встроены две концепции многопоточности: std::marker типажи Sync и Send

Разрешение передачи во владение между потоками с помощью Send

Маркерный типаж Send указывает, что владение типом реализующим Send, может передаваться между потоками.

Любой тип полностью состоящий из типов Send автоматически помечается как Send. Почти все примитивные типы являются Send, кроме сырых указателей.

Разрешение доступа из нескольких потоков с Sync

Маркерный типаж Sync указывает, что на тип реализующий Sync можно безопасно ссылаться из нескольких потоков.

Подобно Send, примитивные типы являются типом Sync, а типы полностью скомбинированные из типов Sync, также являются Sync типом.