Capítulo 17: Concorrência (Kage Bunshin no Jutsu) 👥🌀
Neste capítulo, vamos aprender sobre Concorrência e Threads (Linhas de Execução) no Rust. O Rust é famoso por sua “Concorrência Sem Medo” (Fearless Concurrency), e vamos usar o tema de Clones de Sombra (Naruto)!
📖 O que são Threads?
Normalmente, nosso programa executa uma linha de código por vez. Uma thread permite que o programa execute várias tarefas ao mesmo tempo, aproveitando os múltiplos núcleos do processador! No Rust, o compilador garante que threads diferentes não tentem mexer na mesma memória ao mesmo tempo de forma insegura.
📖 Exemplo Guiado: Clones Trabalhando Juntos
Vamos usar std::thread::spawn para criar clones que executam tarefas enquanto o Naruto original faz outra coisa!
- Crie o arquivo
clones_naruto.rsna pastasrc/:
use std::thread;
use std::time::Duration;
fn main() {
// Criando um clone (uma nova thread)
let clone = thread::spawn(|| {
for i in 1..=3 {
println!("Clone: Estou acumulando chakra... ({})", i);
// Pausa por 1 segundo
thread::sleep(Duration::from_secs(1));
}
});
// Enquanto o clone trabalha, o Naruto original também faz algo!
for i in 1..=3 {
println!("Naruto Original: Treinando Taijutsu... ({})", i);
thread::sleep(Duration::from_millis(500)); // Pausa mais curta
}
// Espera o clone terminar antes de fechar o programa
clone.join().unwrap();
println!("Todos os clones sumiram. Treinamento concluido!");
}🕹️ Como Executar e Testar no VS Code
- Abra o terminal integrado.
- Compile:
rustc clones_naruto.rs - Execute:
./clones_naruto
Resultado Esperado (A ordem pode variar um pouco!):
Naruto Original: Treinando Taijutsu... (1)
Clone: Estou acumulando chakra... (1)
Naruto Original: Treinando Taijutsu... (2)
Naruto Original: Treinando Taijutsu... (3)
Clone: Estou acumulando chakra... (2)
Clone: Estou acumulando chakra... (3)
Todos os clones sumiram. Treinamento concluido!📊 Ilustração Visual: Linhas de Execução
Veja como as tarefas acontecem em paralelo:
graph TD A[main] -->|spawn| B[Thread do Clone] A -->|executa| C[Código do Naruto] B -->|executa| D[Código do Clone] C --> E[join] D --> E E --> F[Fim do Programa]
🛠️ Prática Obrigatória 1: Clones Cozinhando Lamen
Crie um programa chamado clones_lamen.rs onde você cria uma thread (clone) para “cozinhar o macarrão” (exiba mensagens com pausas) e a thread principal (Naruto) fica “preparando os ingredientes”. Use o .join() para garantir que o lamen só fique pronto quando ambos terminarem!
🔑 Gabarito de Código
Prática 1: clones_lamen.rs
use std::thread;
use std::time::Duration;
fn main() {
let clone = thread::spawn(|| {
println!("Clone: Comecei a cozinhar o macarrao...");
thread::sleep(Duration::from_secs(2));
println!("Clone: Macarrao pronto!");
});
println!("Naruto: Cortando os ingredientes...");
thread::sleep(Duration::from_secs(1));
println!("Naruto: Ingredientes prontos!");
clone.join().unwrap();
println!("🏆 Lamen servido! Hora de comer!");
}