и полное владение?
& - просто ссылка Arc - в простонародии счетчик ссылок & естественно значением не владеет, а только ссылается на него, просто копируется Arc хранит в себе значение, мувится, клонится. при клонировании счетчик +1, при удалении счетчик -1 & не изменчив, бери &mut Arc изменчив если счетчик =1
Thread safety тут ортогонально. Главное — то, что Arc сам по себе не даёт времени жизни. Ну и оверхед имеет на безусловную аллокацию и атомарный подсчёт ссылок
Что-то не совсем понял, читать &T с разных поток безопасно?
Да, если T реализует Sync
Хорошо, тогда вопрос, у меня есть неизменяемое состояние типа T, где T: Sync, Как мне лучше его передавать потокам, Arc<T> или &T (владение не требуется)?
У потоков нет проблем с приёмом ссылок, которые Send, но в стд они требуют 'static лайфтайм в связи с апи JoinHandle, которое не гарантирует ожидание выполнения. Если нужны ссылки в безопасном коде в многопотоке, используй crossbeam scoped threads (или подожди 3 месяца, пока их добавят в стейбл)
Через Arc, меньше головняка будет. Но если у тебя все потоки завершаются раньше, чем тот, из которого они порождены, то имеет смысл использовать scoped threads из crossbeam
Обсуждают сегодня