Rc & Arc
Rc<T> usa contagem de referências para compartilhamento em thread única. Arc<T> usa contagem atômica de referências para compartilhamento thread-safe.
Receita
use std::sync::Arc;
use std::thread;
fn main() {
let data = Arc::new(vec![1, 2, 3]);
let d = Arc::clone(&data);
thread::spawn(move || println!("{:?}", d));
println!("{:?}", data);
}Quando usar: Múltiplos proprietários de dados imutáveis; Arc entre threads.
Exemplo de Trabalho
use std::rc::Rc;
struct Node { value: i32, next: Option<Rc<Node>> }
fn main() {
let tail = Rc::new(Node { value: 2, next: None });
let head = Rc::new(Node { value: 1, next: Some(Rc::clone(&tail)) });
println!("{}", head.value);
}O que isso demonstra:
Rc::cloneincrementa a contagem, clone superficial- Compartilhamento imutável de nós de grafo
Option<Rc<Node>>para estrutura de linked list simples
Análise Detalhada
Rc não é Send. Arc é Send + Sync se T: Send + Sync. get_mut é único quando strong_count==1.
Armadilhas
- Rc entre threads - Erro de compilação. Correção:
Arc. - Arc + mutação - Necessita
Mutex/RwLockinterno. Correção:Arc<Mutex<T>>. - Ciclos de referência causam vazamento - Ciclos
Rcnunca são liberados. Correção:Weak. - Confusão de clone -
Rc::clonenão é um clone profundo do conteúdo interno. - Falha ao atualizar
Weak- O alvo foi liberado. Correção: TratarNone.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Empréstimo &T | Tempo de vida de proprietário único | Múltiplos proprietários |
Arena + índices | Grafos sem contagem de referência | Compartilhamento simples |
Cow | Principalmente leitura | Propriedade compartilhada real |
FAQs
strong_count?
Rc::strong_count(&a).weak_count?
Conta referências Weak.try_unwrap?
Se a contagem for 1, extrai T.make_mut?
Clona o interno se for único, caso contrário, muta no local.Arc downgrade?
Arc::downgrade para Weak.serde Arc?
Serializa o T interno.ciclos weak?
Ponteiros pais Weak quebram ciclos Rc.performance?
Custo atômico de inc/dec do Arc vs Rc.Arc no_std?
Ecossistemas portable-atomic.quando não usar Arc?
Thread única - Rc é mais barato.Relacionados
Versões da pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.