База Hintsage

Конкурентность и async

Send/Sync, threads, channels, futures и async runtime.

Практика

Вопросы: Конкурентность и async

В коде ниже компилятор отвергает создание Pin<&mut F>. Какое свойство async-future делает закрепление в памяти необходимым перед передачей future исполнителю?

use std::future::Future;
use std::pin::Pin;

async fn task() {
    let text = String::from("data");
    async {}.await;
    println!("{text}");
}

fn pollable<F: Future>(mut future: F) {
    let pinned = Pin::new(&mut future);
    let _ = pinned;
}

fn main() {
    pollable(task());
}
Программирование RustКонкурентность и asyncРазработчик Rust, занимающийся асинхронными сервисами

После запуска потока компилятор отклоняет этот код. Какое ограничение времени жизни нарушено захваченным значением?

use std::thread;

fn main() {
    let message = String::from("готово");
    let handle = thread::spawn(|| {
        println!("{message}");
    });
    handle.join().unwrap();
}
Программирование RustКонкурентность и asyncRust-разработчик системного программного обеспечения

В коде поток получает собственное владение Rc<Mutex<i32>>, но компилятор всё равно отклоняет запуск. Объясните, какой механизм делает такую передачу недопустимой.

use std::{rc::Rc, sync::Mutex, thread};

fn main() {
    let counter = Rc::new(Mutex::new(0));
    let worker_counter = Rc::clone(&counter);

    thread::spawn(move || {
        *worker_counter.lock().unwrap() += 1;
    }).join().unwrap();
}
Программирование RustКонкурентность и asyncРазработчик Rust, занимающийся многопоточными сервисами

В команде строят пул рабочих потоков, которые должны получать задачи из одной очереди. Какое свойство типа не позволяет передать общий Arc этому коду?

use std::{sync::{mpsc, Arc}, thread};

fn main() {
    let (tx, rx) = mpsc::channel::<u32>();
    let shared_rx = Arc::new(rx);

    for _ in 0..2 {
        let worker_rx = Arc::clone(&shared_rx);
        thread::spawn(move || {
            while let Ok(job) = worker_rx.recv() {
                println!("{job}");
            }
        });
    }

    drop(tx);
}
Программирование RustКонкурентность и asyncRust-разработчик системных сервисов

В многопоточном Rust поток записывает данные, затем выставляет атомарный флаг готовности, а другой поток читает флаг и данные. Почему для публикации данных пары операций с порядком Relaxed недостаточно?

Программирование RustКонкурентность и asyncРазработчик системного программного обеспечения на Rust

Показано 1–20 из 50