No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
Lição 43: Shared State — Mutex e Arc (Cofre Compartilhado)
1. Narrativa
O mecha Æther possui um cofre central de energia que deve ser acessado por múltiplos subsistemas simultaneamente. Sem controle, dois braços poderiam tentar drenar energia ao mesmo tempo, causando sobrecarga. O Mutex é a fechadura do cofre — garante que apenas um sistema por vez acesse o recurso. O Arc é a cópia da chave replicada entre threads, permitindo acesso seguro ao cofre compartilhado.
2. Conceito
Shared State é o modelo onde múltiplas threads compartilham dados via referências inteligentes:
Mutex<T>: Mutex (mutual exclusion) — só uma thread acessa o dado por vezArc<T>: Atomic Reference Counted — referência contada thread-safeMutexGuard: Guard devolvido porlock(), libera automaticamente ao sair de escopoRwLock<T>: Permite múltiplos leitores OU um escritor exclusivoArc::new(Mutex::new(valor)): Padrão canônico para estado compartilhado mutável
3. Requisitos
- Criar
Arc<Mutex<T>>para estado compartilhado entre threads - Usar
lock()para acessar dados protegidos - Usar
RwLockpara cenários de leitura/escrita - Combinar
ArccomMutexeRwLock
4. Design de Dados
graph LR
A[Thread 1] --> D[Arc]
B[Thread 2] --> D
C[Thread 3] --> D
D --> E[Mutex]
E --> F[Dado Compartilhado]
5. Diagrama de Fluxo
flowchart TD
A[Criar Arc Mutex] --> B[Clonar Arc para threads]
B --> C[Thread: lock]
C --> D{Mutex livre?}
D -->|Sim| E[Acessar dado]
D -->|Não| F[Aguardar]
F --> D
E --> G[Modificar dado]
G --> H[Drop MutexGuard]
H --> I[Join threads]
I --> J[Ler resultado final]
6. Funções
| Função | Descrição |
|---|---|
incrementar_com_mutex |
Incrementa contador usando Arc<Mutex<i32>> |
somar_paralelo |
Soma valores em paralelo com Arc<Mutex<i32>> |
coletar_resultados |
Múltiplas threads adicionam a Arc<Mutex<Vec<i32>>> |
contar_palavras |
Conta palavras usando Arc<Mutex<HashMap>> |
atualizar_config |
Atualiza config compartilhado com Arc<RwLock> |
media_paralela |
Calcula média usando Arc<Mutex> para soma e contagem |
buffer_circular |
Buffer circular thread-safe com Arc<Mutex<Vec>> |
estado_do_mecha |
Gerencia estado compartilhado do mecha com Arc<Mutex> |
7. Exemplo
use std::sync::{Arc, Mutex};
use std::thread;
let contador = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let contador_clone = Arc::clone(&contador);
handles.push(thread::spawn(move || {
let mut num = contador_clone.lock().unwrap();
*num += 1;
}));
}
for handle in handles {
handle.join().unwrap();
}
assert_eq!(*contador.lock().unwrap(), 10);
8. Missão
- Implementar
incrementar_com_mutexusandoArc<Mutex<i32>>com múltiplas threads - Implementar
somar_paralelodividindo trabalho entre threads - Implementar
coletar_resultadoscomArc<Mutex<Vec<i32>>> - Implementar
contar_palavrasusandoArc<Mutex<HashMap<String, usize>>> - Implementar
atualizar_configcomArc<RwLock<HashMap>> - Implementar
media_paralelacomputando soma e contagem em paralelo - Implementar
buffer_circularcom rotação thread-safe - Implementar
estado_do_mechagerenciando estado complexo compartilhado
9. Como Executar
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check
10. Dicas
- Sempre use
Arcpara compartilharMutexentre threads —Mutexnão éClone lock()retornaResult<MutexGuard, PoisonError>— useunwrap()ou trate erroMutexGuardimplementaDerefeDerefMut— acesse o dado diretamenteRwLock::read()permite múltiplos leitores simultâneosRwLock::write()é exclusivo — bloqueia leitores e outros escritoresArc::cloneincrementa o contador atômico — é barato (copia o ponteiro)