Введение#
Если вы уже знакомы с 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 становится незаменимым.
На сегодня это все!