Стабилизирован SyncView — обёртка, делающая не-Sync значение безопасным для обмена
26.09.2026core::sync::SyncView теперь стабилен. Это обёртка, которая даёт объекту Sync, но предоставляет к нему только изменяемый доступ. Она нужна, чтобы передавать Send-но-не-Sync значения между потоками.
Зачем это нужно
Наивное «сделать всё Sync» небезопасно: если два потока получат разделяемые ссылки на один и тот же объект, они смогут обращаться к нему одновременно. SyncView решает это иначе — Sync реализуется для обёртки, но доступ к содержимому возможен исключительно через &mut, а значит, эксклюзивно.
Типичное применение, которое называлось в отслеживающем issue, — передача фьючер, реализующих Send, но не Sync, как это делает BoxFuture.
API
SyncView::new(x)иinto_inner(self)— обеconstas_pin/as_pin_mut— доступ к содержимому черезPin, тожеconstas_pinреализован дляT: ?Sized,as_pin_mut— только когдаT: UnpinDebugреализован безусловно, независимо от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