Трейт 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,
который позволяет безопасно перемещать тип после закрепления