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!

  1. Crie o arquivo clones_naruto.rs na pasta src/:
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

  1. Abra o terminal integrado.
  2. Compile: rustc clones_naruto.rs
  3. 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!");
}

Capitulo Anterior | Proximo Capitulo