Введение#
Если вы уже знакомы с Rc<T>
(если не знакомы, то можете прочитать прошлую статью), то, возможно задавались вопросом - а можно ли безопасно делить данные между потоками? Ответ — можно, но для этого нужен другой тип: Arc<T>
.
Что такое Arc?#
Arc
расшифровывается как Atomically Reference Counted (атомарный счетчик ссылок). Он работает как Rc
, но с одной важной особенностью: он потокобезопасен. То есть, в отличие от Rc
, его можно использовать в многопоточном коде.
Синтаксис базового использования:#
use std::sync::Arc;
let data = Arc::new(vec![1, 2, 3]);
let data_cloned = Arc::clone(&data);
Ключевые особенности Arc:#
- Подсчёт ссылок происходит атомарно (через атомарные инструкции процессора).
- Может использоваться в нескольких потоках.
- Не даёт изменять данные напрямую — для этого используется
Mutex
,RwLock
или другие инструменты о которых постараюсь рассказать в следующих статьях.
Сравнение с Rc:#
Тип | Поддерживает многопоточность | Атомарный подсчет |
---|---|---|
Rc | ❌ Нет | ❌ Нет |
Arc | ✅ Да | ✅ Да |
Пример#
Пример для случая когда нужно изменить данные#
Arc сам по себе не даёт изменять содержимое.
Если нужно менять данные из разных потоков, используйте Mutex
(мютекс это как замок, который позволяет работать с данными только одному потоку за раз):
Мы изучим
Mutex
иthread::spawn
более глубоко в следующих статьях - это важные концепции языка Rust для работы с потоками.
Практические советы по Arc#
- Используйте
Arc
если данные нужны в нескольких потоках. - Для изменяемых данных — комбинируйте с
Mutex
,RwLock
и т.д. - Не злоупотребляйте
Arc
: каждый клон — это атомарная операция, она дороже, чем обычный счётчикRc
. - 🦀 hard skill не для начинающих!По умолчанию
Arc<T>
— этоSend + Sync
для случая когдаT: Send + Sync
.
Заключение#
Arc полезен когда вы работаете с многопоточностью. Он гарантирует безопасность при доступе к общим данным. Но требует осторожности в плане производительности. Если вам не нужен доступ из разных потоков - используйте Rc
. Но когда дело доходит до многопоточного доступа — Arc
становится незаменимым.
На сегодня это все!