ЛЕКЦІЯ 20

Многопотоковість (Multithreading) в Rust

Рецензія: Traits и Generics

План

  • Threads на OS
  • Message passing
  • Shared state з Mutex

Thread

Thread

Легка одиниця паралельного виконання. На OS-рівні.

Створення потока

use std::thread;
use std::time::Duration;

let handle = thread::spawn(|| {
  for i in 1..5 {
    println!("Thread: {}", i);
    thread::sleep(Duration::from_millis(100));
  }
});

handle.join().unwrap();  // Чекаємо завершення

Message Passing

Message Passing

Безпечна передача даних між потоками через channels (як Go).

MPSC Channel (Multi-Producer, Single-Consumer)

use std::sync::mpsc;
use std::thread;

let (tx, rx) = mpsc::channel();

thread::spawn(move || {
  tx.send("hello").unwrap();
});

let msg = rx.recv().unwrap();
println!("Received: {}", msg);

Mutex

Mutex

Mutual exclusion - синхронізація доступу до спільних даних.

Mutex для спільного стану

use std::sync::Mutex;
use std::sync::Arc;
use std::thread;

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!("Counter: {}", *counter.lock().unwrap());

Arc<T>

Arc

Atomic Reference Counting. Дозволяє кільком потокам мати власність.

Многопотоковість в Rust

Запитання 1

Якої структури потрібна для спільного доступу?

  • Arc<Mutex<T>>
  • &T
  • Box<T>
✅ Правильна відповідь: Arc<Mutex<T>>

Запитання 2

Що забезпечує Message Passing?

  • Безпечна комунікація без共享状態
  • Швидкість
  • Автоматичну синхронізацію
✅ Правильна відповідь: Безпечна комунікація без共享状態

Помилка: Забув Arc

⚠️ ЗАСТЕРЕЖЕННЯ

❌ Неправильно

✓ Правильно

Підсумки

  • Потоки для паралельності
  • Channels для message passing
  • Mutex для спільного стану
  • Arc для кількох власників

Далі

Наступна лекція:

Лекція 21: Docker и Контейнери

Дякую за увагу! 💾

← Повернутися до списку лекцій