Класс Arc
Класс Arc (Atomic Reference Counted) представляет
собой умный указатель с атомарным подсчётом ссылок.
Он позволяет нескольким владельцам одновременно
владеть одними и теми же данными, а когда последняя
ссылка уничтожается, значение автоматически
освобождается. В отличие от Rc, класс Arc
можно безопасно передавать между потоками, так как
счётчик ссылок изменяется атомарно. Параметром
конструктор принимает значение, которым нужно
владеть совместно.
Синтаксис
use std::sync::Arc;
Arc::new(value)
Пример
Давайте создадим Arc с числом 5 и
получим его значение:
use std::sync::Arc;
fn main()
{
let res = Arc::new(5);
println!("{}", res);
}
Результат выполнения кода:
5
Пример
Давайте создадим Arc и клонируем его,
чтобы получить два владельца одних и тех же данных:
use std::sync::Arc;
fn main()
{
let a = Arc::new(5);
let b = Arc::clone(&a);
println!("{}", a);
println!("{}", b);
}
Результат выполнения кода:
5
5
Пример
Давайте подсчитаем количество владельцев Arc
с помощью метода strong_count:
use std::sync::Arc;
fn main()
{
let a = Arc::new(5);
let b = Arc::clone(&a);
let c = Arc::clone(&a);
let res = Arc::strong_count(&a);
println!("{}", res);
}
Результат выполнения кода:
3
Пример
Давайте используем Arc для совместного
владения вектором из нескольких потоков:
use std::sync::Arc;
use std::thread;
fn main()
{
let data = Arc::new(vec![1, 2, 3, 4, 5]);
let mut handles = vec![];
for _ in 0..3 {
let data = Arc::clone(&data);
let handle = thread::spawn(move || {
println!("{:?}", data);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
Смотрите также
-
метод
new,
который создаёт новый экземпляр Arc -
метод
clone,
который увеличивает счётчик ссылок и возвращает новый Arc -
метод
try_unwrap,
который пытается извлечь значение, если Arc единственный владелец -
метод
downgrade,
который создаёт слабую ссылку Weak на данные