BorrowCheck › Ядро языка Rust

Многопоточность

Потоки, Send / Sync, каналы, Mutex / RwLock, атомики и порядок памяти, гонки данных.

Тема объясняет многопоточность в Rust и то, как система типов исключает гонки данных. Вопросы о потоках проверяют, почему замыкание thread::spawn должно владеть своими данными (E0373), что возвращает join и как ограниченные потоки thread::scope заимствуют локальные данные и сообщают о панике. Раздел о Send и Sync разбирает эти автотрейты у типов стандартной библиотеки, Rc и RefCell в нескольких потоках, охранное значение блокировки и способы лишить тип Send; раздел о каналах mpsc — порядок сообщений, закрытие канала, канал нулевой ёмкости и try_send. Разделы о Mutex и RwLock рассматривают Arc<Mutex<T>>, повторный захват блокировки и взаимную блокировку, отравление (poisoning) после паники и Condvar::wait; раздел об атомиках — fetch_add, compare_exchange и compare_exchange_weak и порядок памяти от Relaxed до SeqCst с отношением happens-before. Последний раздел отделяет гонку данных, которая является неопределённым поведением, от состояния гонки (race condition), которое безопасный код не исключает, и показывает, что пропускает unsafe. Тема опирается на умные указатели и внутреннюю изменяемость и подготавливает к асинхронности.

46 вопросов: базовый уровень — 19, средний — 23, углублённый — 4. 6 справок, 22 источника.

Разделы

  1. Потоки и thread::scope
  2. Send и Sync
  3. Каналы
  4. Mutex, RwLock, отравление
  5. Атомики и порядок памяти
  6. Гонки данных и UB

Предыдущая тема: Drop, RAII, порядок уничтожения · Следующая тема: Асинхронность