База Hintsage

Программирование Rust

Язык Rust и безопасное системное программирование.

Темы раздела

Выберите подраздел

Практика

Вопросы: Программирование Rust

Сервис запускает синхронную запись через spawn_blocking, после чего отменяет задачу. Что гарантирует abort(), если замыкание уже начало выполняться?

use std::time::Duration;

#[tokio::main]
async fn main() {
    let handle = tokio::task::spawn_blocking(|| {
        std::thread::sleep(Duration::from_secs(5));
        println!("запись завершена");
    });

    handle.abort();
    println!("запрос отменён");
}

Рассмотрите код. Какую гарантию синхронизации даёт join() в отношении результата атомарной записи?

use std::sync::{Arc, atomic::{AtomicUsize, Ordering}};
use std::thread;

fn main() {
    let value = Arc::new(AtomicUsize::new(0));
    let worker_value = Arc::clone(&value);
    let handle = thread::spawn(move || {
        worker_value.store(42, Ordering::Relaxed);
    });

    handle.join().unwrap();
    println!("{}", value.load(Ordering::Relaxed));
}
Программирование RustКонкурентность и asyncRust-разработчик системных сервисов

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

Программирование 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-разработчик системных сервисов

Показано 121140 из 348