Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 196новых вакансий за сутки·91 460вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 137
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 146
  • Облачные технологии14 070
  • QA вакансии3 446
  • Backend вакансии2 089
  • Инженер данных1 792
  • Продакт-менеджер1 233

Разработка

  • Android1 863
  • iOS1 701
  • Fullstack вакансии976
  • AI вакансии944
  • Frontend вакансии738
  • Mobile вакансии44

По стеку

  • Go8 699
  • Java6 545
  • Node.js2 025
  • .NET1 723
  • Kotlin1 613
  • Rust1 462
  • C#710
  • PHP684
  • C++574

DevOps и инфраструктура

  • Kubernetes7 765
  • DevOps вакансии6 051
  • Linux-инфраструктура5 492
  • Terraform / IaC4 271
  • CI/CD3 242
  • Мониторинг и Observability1 790
  • SRE565
  • Кибербезопасность451

Аналитика и данные

  • Data Scientist1 124
  • Бизнес-аналитик916
  • Аналитик данных839
  • Системный аналитик151

Другие направления

  • Проджект-менеджер606
  • UI/UX дизайн142
  • Ручное тестирование14

По регионам

  • Вакансии в США43 094
  • Вакансии в Европе23 429
  • Вакансии в Канаде4 376
  • Работа в России3 902

По формату

  • Удалённые вакансии72 758
  • Релокация в США43 100
  • Гибридная работа12 402
  • Офисная работа7 096

По уровню

  • Senior вакансии42 000
  • Middle вакансии20 393
  • Junior вакансии6 602

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме RustВсе вопросы
RustMiddleТеория

Что такое Send и Sync и почему они важны для конкурентного программирования?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Send означает, что тип можно переместить в другой поток; Sync — что на него можно иметь разделяемую ссылку из нескольких потоков. Компилятор выводит эти трейты автоматически и использует их для статической гарантии отсутствия data races.

Практический пример: Arc + Mutex для shared state

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

fn main() {
    let counter = Arc::new(Mutex::new(0u64));
    let mut handles = vec![];

    for _ in 0..8 {
        let c = Arc::clone(&counter);
        let h = thread::spawn(move || {
            // move захватывает c (Arc<Mutex<u64>>)
            // Arc: Sync => &Arc можно передать; Arc: Send => можно переместить
            let mut guard = c.lock().unwrap();
            *guard += 1;
        });
        handles.push(h);
    }

    for h in handles {
        h.join().unwrap();
    }

    println!("Counter: {}", *counter.lock().unwrap());
}

Send и Sync: маркерные трейты безопасного параллелизма

Rust гарантирует отсутствие гонок данных (data races) на уровне системы типов с помощью двух маркерных трейтов из std::marker:

  • Send — тип можно безопасно передать (переместить) в другой поток.
  • Sync — на тип можно иметь разделяемую ссылку из нескольких потоков одновременно. Иначе говоря, T: Sync тогда и только тогда, когда &T: Send.

Оба трейта реализуются автоматически (auto traits) компилятором для большинства типов. Вы не пишете impl Send for MyType вручную в обычном коде — компилятор выводит это на основе полей структуры.

Примеры типов и их Send/Sync статус

  • i32, String, Vec<T> — Send + Sync (если T: Send + Sync).
  • Rc<T> — !Send, !Sync: счётчик ссылок не атомарный, совместный доступ из нескольких потоков приведёт к гонке.
  • Arc<T> — Send + Sync (если T: Send + Sync): атомарный счётчик ссылок.
  • RefCell<T> — Send (если T: Send), но !Sync: внутренняя мутабельность без синхронизации.
  • Mutex<T> — Send + Sync (если T: Send): мьютекс защищает доступ.
  • Сырые указатели *const T, *mut T — !Send, !Sync.

Почему Rc нельзя передать между потоками

use std::rc::Rc;
use std::thread;

fn main() {
    let val = Rc::new(42);
    // Ошибка компиляции: `Rc<i32>` cannot be sent between threads safely
    // thread::spawn(move || println!("{}", val));
}

Ручная реализация Send/Sync (unsafe)

Если ваш тип содержит сырой указатель, но вы знаете, что он безопасен для передачи между потоками, можно вручную объявить Send/Sync через unsafe impl:

struct MyWrapper(*mut u8);

// SAFETY: мы гарантируем, что *mut u8 не используется конкурентно без синхронизации
unsafe impl Send for MyWrapper {}
unsafe impl Sync for MyWrapper {}

Подводные камни

  • !Send тип в tokio::spawn: tokio::spawn требует Future: Send + 'static. Случайный захват Rc или RefCell в async-блоке вызовет ошибку компиляции с длинным диагностическим сообщением.
  • Ручной unsafe impl без инвариантов: объявить unsafe impl Send просто — нарушить гарантии ещё проще. Это единственный способ получить data race в безопасном Rust-коде.
  • Sync != Copy: многие путают эти трейты. Sync означает безопасность разделяемого доступа, а не возможность копирования.
  • PhantomData: если вы добавляете PhantomData<*mut T>, структура автоматически становится !Send + !Sync. Это правильное поведение для FFI-типов, но может удивить.
  • Взаимодействие с interior mutability: Cell<T> — !Sync, даже если T: Sync, потому что позволяет изменять значение через shared reference без синхронизации.
  • Arc<RefCell<T>> не Sync: комбинация Arc (Sync) и RefCell (!Sync) даёт !Sync для всей обёртки — это частая ошибка при попытке shared mutable state.

Типичные ошибки

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

Что проверяет интервьюер

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

Как вы знаете этот вопрос?

Проверить себя по теме Rust →

Источники

  • https://doc.rust-lang.org/book/
  • https://doc.rust-lang.org/cargo/reference/
←Предыдущий вопросВ чём разница между `std::sync::Mutex` и `tokio::sync::Mutex`?Следующий вопрос→Как работает async/await в Rust? Что такое `Future`?

Связанные темы

Rustrisk-analysisrust-productiontechnical-depth

Вакансии с этим навыком

Rust вакансии
  • Embedded Software Engineer, Satellite Antenna (Starlink)
  • Software Engineer, Imaging
  • Engineering Manager, Bots & Fraud
  • Staff Software Engineer, Firefox Enterprise
  • Forward Deployed Software Engineer, Connected Warfare (Active Clearance)

Частые вопросы на собеседовании

  • Для каких задач Rust является сильным выбором, а где лучше честно выбрать другой язык?
  • Какие production-риски чаще всего возникают в проектах на Rust: производительность, зависимости, конкурентность, деплой или observability?
  • Как сравнить Rust с ближайшими альтернативами по производительности, поддерживаемости, найму и экосистеме?
  • Какие особенности runtime, type system или memory model Rust реально влияют на архитектуру приложения?