РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
556 of 1245 menu

Трейт Sync

Трейт Sync - это маркерный трейт, который гарантирует, что ссылка на тип может быть безопасно разделена между несколькими потоками выполнения. Если тип T реализует Sync, то &T также реализует Send. Это означает, что данные, хранящиеся в типе, не содержат внутренней изменяемости, которая могла бы привести к гонкам данных. Трейт не имеет методов и параметров, он автоматически реализуется для типов, состоящих из компонентов, которые также являются Sync.

Синтаксис

pub unsafe auto trait Sync { }

Пример

Давайте проверим, что стандартный тип i32 является Sync, и его можно безопасно передать в другой поток:

use std::thread; fn main() { let x = 12345; let handle = thread::spawn(move || { println!("{}", x); }); handle.join().unwrap(); }

Результат выполнения кода:

12345

Пример

Давайте создадим структуру, содержащую Rc, который не является Sync, и попробуем передать ссылку на неё в поток. Компилятор выдаст ошибку:

use std::rc::Rc; use std::thread; struct MyStruct { data: Rc<i32>, } fn main() { let s = MyStruct { data: Rc::new(12345) }; let handle = thread::spawn(|| { println!("{}", s.data); }); handle.join().unwrap(); }

Результат выполнения кода (ошибка компиляции):

error[E0277]: `Rc<i32>` cannot be sent between threads safely

Смотрите также

  • трейт Send,
    который указывает, что тип можно передавать между потоками
  • трейт Trait,
    который описывает общее поведение типов
  • трейт Trait Bound,
    который ограничивает обобщённые типы
  • трейт Unpin,
    который позволяет безопасно перемещать тип после закрепления
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить