RS Rust  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Потоки и каналы

Разбирает создание потоков, перенос захваченных значений, каналы и координацию общего состояния. Вопросы распределены между чтением кода, диагностикой компиляции, выбором исправления, граничными случаями и инженерными решениями. Базовый синтаксис соответствует Rust 2024 edition; задания не требуют nightly, если это прямо не сказано.

Отвечено: 0 из 25
--:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 5 тематическим шкалам и подробные объяснения.
Вопрос 1 из 25
Какой принцип лежит в основе механизма «Замыкания с переносом move»?
Вопрос 2 из 25
Что исправить вокруг `std::thread`, чтобы граничный вход обрабатывался безопасно?
RustRust · Потоки thread
use std::thread;
let handle = thread::spawn(|| 6 * 7);
println!("{}", handle.join().unwrap());
Вопрос 3 из 25
Какая правка выдержит ревью контракта «Замыкания с переносом move»?
RustRust · Замыкания с переносом move
use std::thread;
let data = vec![1, 2, 3];
let handle = thread::spawn(move || data.len());
println!("{}", handle.join().unwrap());
Вопрос 4 из 25
Что должно войти в отрицательный тест механизма «Замыкания с переносом move»?
Вопрос 5 из 25
Как устранить исходную ошибку, связанную с `std::sync::mpsc`?
RustRust · Каналы mpsc
use std::sync::mpsc;
let (tx, rx) = mpsc::channel();
let message = String::from("done");
tx.send(message).unwrap();
println!("{}", rx.recv().unwrap());
Вопрос 6 из 25
На какое правило следует опираться при ревью кода по теме «Тестирование и инструменты Cargo» в контексте «Потоки и каналы»?
Вопрос 7 из 25
Как переработать участок с `channel_closes_after_last_sender`, сохранив требуемое поведение?
RustRust · Тестирование и инструменты Cargo
#[test]
fn channel_closes_after_last_sender() {
    let (tx, rx) = std::sync::mpsc::channel::<u8>();
    let tx2 = tx.clone();
    drop(tx);
    drop(tx2);
    assert!(rx.recv().is_err());
}
Вопрос 8 из 25
Как правильно прочитать результат диагностического сценария `recv`?
RustRust · Каналы mpsc
let tx2 = tx.clone();
drop(tx);
drop(tx2);
assert!(rx.recv().is_err());
Вопрос 9 из 25
Какой край контракта «Тестирование и инструменты Cargo» чаще всего остаётся незамеченным в контексте «Потоки и каналы»?
Вопрос 10 из 25
Какой вывод о выполнении `std::thread` подтверждает код?
RustRust · Потоки thread
use std::thread;
let handle = thread::spawn(|| 6 * 7);
println!("{}", handle.join().unwrap());
Вопрос 11 из 25
Что произойдёт после операции `std::sync::mpsc`?
RustRust · Каналы mpsc
use std::sync::mpsc;
let (tx, rx) = mpsc::channel();
let message = String::from("done");
tx.send(message).unwrap();
println!("{}", rx.recv().unwrap());
Вопрос 12 из 25
Какой эксплуатационный край отличает контракт «Потоки thread» от удачного примера?
Вопрос 13 из 25
Какой путь выполнения выберет Rust после `std::thread`?
RustRust · Замыкания с переносом move
use std::thread;
let data = vec![1, 2, 3];
let handle = thread::spawn(move || data.len());
println!("{}", handle.join().unwrap());
Вопрос 14 из 25
Как правильно прочитать результат диагностического сценария `std::rc::Rc::new`?
RustRust · Замыкания с переносом move
let local = std::rc::Rc::new(1);
// std::thread::spawn(move || println!("{local}"));
Вопрос 15 из 25
Какой граничный случай важнее всего учесть для механизма «Каналы mpsc»?
Вопрос 16 из 25
Как правильно прочитать результат диагностического сценария `channel_closes_after_last_sender`?
RustRust · Тестирование и инструменты Cargo
#[test]
fn channel_closes_after_last_sender() {
    let (tx, rx) = std::sync::mpsc::channel::<u8>();
    let tx2 = tx.clone();
    drop(tx);
    drop(tx2);
    assert!(rx.recv().is_err());
}
Вопрос 17 из 25
Как Rust выполнит этот фрагмент о механизме «Разделяемое состояние»?
RustRust · Разделяемое состояние
use std::sync::{Arc, Mutex};
use std::thread;
let counter = Arc::new(Mutex::new(0));
let mut handles = Vec::new();
for _ in 0..4 {
    let c = Arc::clone(&counter);
    handles.push(thread::spawn(move || *c.lock().unwrap() += 1));
}
for h in handles { h.join().unwrap(); }
println!("{}", *counter.lock().unwrap());
Вопрос 18 из 25
Что нужно проверить отдельно при переносе механизма «Разделяемое состояние» в библиотечный код?
Вопрос 19 из 25
Что нужно пересмотреть в использовании `std::sync::`, чтобы код стал корректным?
RustRust · Разделяемое состояние
use std::sync::{Arc, Mutex};
use std::thread;
let counter = Arc::new(Mutex::new(0));
let mut handles = Vec::new();
for _ in 0..4 {
    let c = Arc::clone(&counter);
    handles.push(thread::spawn(move || *c.lock().unwrap() += 1));
}
for h in handles { h.join().unwrap(); }
println!("{}", *counter.lock().unwrap());
Вопрос 20 из 25
Как сформулировать контракт механизма «Потоки thread» без привязки к именам переменных?
Вопрос 21 из 25
Какой вывод о механизме «Каналы mpsc» соответствует модели Rust?
Вопрос 22 из 25
На какую часть контракта распространяется проверка `std::thread::spawn`?
RustRust · Потоки thread
let handle = std::thread::spawn(|| panic!("worker failed"));
assert!(handle.join().is_err());
Вопрос 23 из 25
На какое правило следует опираться при ревью кода по теме «Разделяемое состояние»?
Вопрос 24 из 25
Что показывает `channel_closes_after_last_sender` применительно к механизму «Тестирование и инструменты Cargo»?
RustRust · Тестирование и инструменты Cargo
#[test]
fn channel_closes_after_last_sender() {
    let (tx, rx) = std::sync::mpsc::channel::<u8>();
    let tx2 = tx.clone();
    drop(tx);
    drop(tx2);
    assert!(rx.recv().is_err());
}

# cargo test channel_closes_after_last_sender -- --exact
# cargo test -- --test-threads=1  # только для изоляции глобального состояния, не для исправления гонок
Вопрос 25 из 25
Как следует интерпретировать результат проверки `std::sync::atomic::`?
RustRust · Разделяемое состояние
use std::sync::atomic::{AtomicUsize, Ordering};
let counter = AtomicUsize::new(0);
counter.fetch_add(1, Ordering::Relaxed);
assert_eq!(counter.load(Ordering::Relaxed), 1);

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe)

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу