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

Send, Sync и конкурентная безопасность

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

Отвечено: 0 из 25
--:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 5 тематическим шкалам и подробные объяснения.
Вопрос 1 из 25
Как убрать источник проблемы в коде с `std::thread::JoinHandle`?
RustRust · Безопасная передача
fn run<T: Send + 'static>(value: T) -> std::thread::JoinHandle<T> {
    std::thread::spawn(move || value)
}
let h = run(String::from("x"));
Вопрос 2 из 25
Как устранить причину диагностики в строке с `std::rc::Rc::new`?
RustRust · Автоматические трейты
struct Wrapper<T>(T);
fn require_send<T: Send>(_value: T) {}
require_send(Wrapper(String::from("x")));
// require_send(Wrapper(std::rc::Rc::new(1)));
Вопрос 3 из 25
Как завершится обычная ветвь выполнения после `std::rc::Rc::new`?
RustRust · Автоматические трейты
struct Wrapper<T>(T);
fn require_send<T: Send>(_value: T) {}
require_send(Wrapper(String::from("x")));
// require_send(Wrapper(std::rc::Rc::new(1)));
Вопрос 4 из 25
Что нужно изменить вокруг `std::rc::Rc::new`, чтобы устранить первопричину?
RustRust · Ошибки компилятора
let value = std::rc::Rc::new(5);
std::thread::spawn(move || println!("{value}"));
Вопрос 5 из 25
Какое правило связывает типы и наблюдаемое поведение в механизме «Автоматические трейты»?
Вопрос 6 из 25
Какое правило Rust точнее всего описывает механизм «Безопасная передача»?
Вопрос 7 из 25
Какая строка нарушает контракт «Ошибки компилятора»?
RustRust · Ошибки компилятора
let value = std::rc::Rc::new(5);
std::thread::spawn(move || println!("{value}"));
Вопрос 8 из 25
Что именно подтверждает проверка с `std::rc::Rc::new`?
RustRust · Тестирование и инструменты Cargo
/// ```compile_fail
/// let value = std::rc::Rc::new(1);
/// std::thread::spawn(move || drop(value));
/// ```
pub fn rc_is_not_send() {}
Вопрос 9 из 25
Что ещё нужно проверить, прежде чем считать реализацию «Общий доступ» надёжной?
Вопрос 10 из 25
Что система типов не проверит самостоятельно для механизма «Безопасная передача»?
Вопрос 11 из 25
Что устанавливает сценарий `std::sync::Arc` и где проходит граница его вывода?
RustRust · Тестирование и инструменты Cargo
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<std::sync::Arc<std::sync::Mutex<i32>>>();
Вопрос 12 из 25
Что устанавливает сценарий `std::thread::spawn` и где проходит граница его вывода?
RustRust · Ошибки компилятора
type Job = Box<dyn FnOnce()>;
// std::thread::spawn(move || job());
Вопрос 13 из 25
Какое изменение входа способно поменять вывод о механизме «Автоматические трейты»?
Вопрос 14 из 25
Какая правка к стратегии тестирования действительно покрывает границы `Send` и `Sync`, а не только один удачный запуск?
RustRust · Тестирование и инструменты Cargo
/// ```compile_fail
/// let value = std::rc::Rc::new(1);
/// std::thread::spawn(move || drop(value));
/// ```
pub fn rc_is_not_send() {}
Вопрос 15 из 25
Какой дефект способен воспроизвести тест `std::cell::Cell`?
RustRust · Общий доступ
use std::cell::Cell;
fn require_sync<T: Sync>() {}
// require_sync::<Cell<i32>>();
Вопрос 16 из 25
Как сформулировать контракт механизма «Тестирование и инструменты Cargo» без привязки к именам переменных?
Вопрос 17 из 25
Какой принцип Rust объясняет обычный сценарий для «Ошибки компилятора»?
Вопрос 18 из 25
Какое условие способно превратить рабочий пример «Тестирование и инструменты Cargo» в ошибочный?
Вопрос 19 из 25
Как обновить фрагмент с `std::thread::scope`, чтобы ошибка исчезла по существу?
RustRust · Общий доступ
fn require_shared<T: Sync>(value: &T) {
    std::thread::scope(|s| {
        s.spawn(|| { let _ = value; });
        s.spawn(|| { let _ = value; });
    });
}
require_shared(&String::from("x"));
Вопрос 20 из 25
Какое состояние получится после всех действий с `std::thread::scope`?
RustRust · Общий доступ
fn require_shared<T: Sync>(value: &T) {
    std::thread::scope(|s| {
        s.spawn(|| { let _ = value; });
        s.spawn(|| { let _ = value; });
    });
}
require_shared(&String::from("x"));
Вопрос 21 из 25
Что Rust гарантирует при корректном использовании «Общий доступ»?
Вопрос 22 из 25
Что именно подтверждает проверка с `std::thread::scope`?
RustRust · Безопасная передача
let data = vec![1, 2, 3];
std::thread::scope(|scope| {
    scope.spawn(|| assert_eq!(data.len(), 3));
});
Вопрос 23 из 25
Что именно подтверждает проверка с `std::marker::PhantomData`?
RustRust · Автоматические трейты
use std::marker::PhantomData;
struct NotSend(PhantomData<std::rc::Rc<()>>);
Вопрос 24 из 25
К какому результату приводит последовательность вокруг `std::thread::JoinHandle`?
RustRust · Безопасная передача
fn run<T: Send + 'static>(value: T) -> std::thread::JoinHandle<T> {
    std::thread::spawn(move || value)
}
let h = run(String::from("x"));
Вопрос 25 из 25
Что может сломаться при другом размере входа или порядке действий в «Ошибки компилятора»?

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

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

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

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