Стабилизирован SyncView — обёртка, делающая не-Sync значение безопасным для обмена

26.09.2026

core::sync::SyncView теперь стабилен. Это обёртка, которая даёт объекту Sync, но предоставляет к нему только изменяемый доступ. Она нужна, чтобы передавать Send-но-не-Sync значения между потоками.

Зачем это нужно

Наивное «сделать всё Sync» небезопасно: если два потока получат разделяемые ссылки на один и тот же объект, они смогут обращаться к нему одновременно. SyncView решает это иначе — Sync реализуется для обёртки, но доступ к содержимому возможен исключительно через &mut, а значит, эксклюзивно.

Типичное применение, которое называлось в отслеживающем issue, — передача фьючер, реализующих Send, но не Sync, как это делает BoxFuture.

API

  • SyncView::new(x) и into_inner(self) — обе const
  • as_pin / as_pin_mut — доступ к содержимому через Pin, тоже const
  • as_pin реализован для T: ?Sized, as_pin_mut — только когда T: Unpin
  • Debug реализован безусловно, независимо от Sync у содержимого
  • From<T>, AsRef (при T: Sync), AsMut, а также пробрасывающие реализации Clone, Copy, PartialEq и FnOnce — последние требуют Sync, если метод берёт &self, и не требуют, если &mut self

Отслеживающий issue — rust-lang/rust#98407. Фича долго называлась Exclusive и переименована в SyncView по ходу дела; автор стабилизации — tisonkun.

Оригинал

Stabilize SyncView

Упоминаний: 1 · Просмотров: 4