Bird
Raised Fist0
Rustprogramming~10 mins

Creating threads in Rust - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to create a new thread that prints "Hello from thread!".

Rust
use std::thread;

fn main() {
    let handle = thread::[1](|| {
        println!("Hello from thread!");
    });

    handle.join().unwrap();
}
Drag options to blanks, or click blank then click option'
Aspawn
Bstart
Crun
Dcreate
Attempts:
3 left
💡 Hint
Common Mistakes
Using a non-existent function like 'start' or 'create' instead of 'spawn'.
Forgetting to call join() to wait for the thread to finish.
2fill in blank
medium

Complete the code to move ownership of the variable data into the new thread.

Rust
use std::thread;

fn main() {
    let data = vec![1, 2, 3];

    let handle = thread::spawn(move || {
        println!("Data: {:?}", [1]);
    });

    handle.join().unwrap();
}
Drag options to blanks, or click blank then click option'
Adata
Bdata.clone()
C&data
Dref data
Attempts:
3 left
💡 Hint
Common Mistakes
Trying to borrow data with &data inside a move closure.
Using data.clone() unnecessarily.
3fill in blank
hard

Fix the error in the code by completing the blank to properly handle the thread's result.

Rust
use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        5 + 10
    });

    let result = handle.[1]().unwrap();
    println!("Result: {}", result);
}
Drag options to blanks, or click blank then click option'
Afinish
Bwait
Cjoin
Dcomplete
Attempts:
3 left
💡 Hint
Common Mistakes
Using non-existent methods like wait or finish.
Not calling unwrap() to get the thread's result.
4fill in blank
hard

Fill both blanks to create multiple threads that print their index.

Rust
use std::thread;

fn main() {
    let mut handles = vec![];

    for i in 0..3 {
        let handle = thread::spawn([1] || {
            println!("Thread number: {}", [2]);
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }
}
Drag options to blanks, or click blank then click option'
Amove
Bi + 1
Ci
Dref
Attempts:
3 left
💡 Hint
Common Mistakes
Forgetting move causes borrowing errors.
Using i + 1 changes the thread number unexpectedly.
5fill in blank
hard

Fill all three blanks to create a thread that returns the length of a string.

Rust
use std::thread;

fn main() {
    let text = String::from("hello");

    let handle = thread::[1](move || {
        [2].len()
    });

    let length = handle.[3]().unwrap();
    println!("Length: {}", length);
}
Drag options to blanks, or click blank then click option'
Aspawn
Btext
Cjoin
Drun
Attempts:
3 left
💡 Hint
Common Mistakes
Using run instead of spawn.
Not moving text into the closure.
Forgetting to call join().

Practice

(1/5)
1. What does thread::spawn do in Rust?
easy
A. It stops all threads immediately.
B. It pauses the current thread for a set time.
C. It creates a new thread to run code concurrently.
D. It merges two threads into one.

Solution

  1. Step 1: Understand the purpose of thread::spawn

    This function is used to start a new thread that runs code independently from the main thread.
  2. Step 2: Compare options with the function's role

    Only "It creates a new thread to run code concurrently." correctly describes creating a new thread. Other options describe unrelated actions.
  3. Final Answer:

    It creates a new thread to run code concurrently. -> Option C
  4. Quick Check:

    thread::spawn creates threads [OK]
Hint: Remember: spawn means start a new thread [OK]
Common Mistakes:
  • Confusing spawn with pausing or stopping threads
  • Thinking spawn merges threads
  • Assuming spawn waits for thread completion
2. Which of the following is the correct syntax to create a new thread in Rust?
easy
A. let handle = thread::spawn(|| { println!("Hello"); });
B. let handle = spawn::thread(|| { println!("Hello"); });
C. thread.spawn(|| println!("Hello"));
D. thread::create(|| { println!("Hello"); });

Solution

  1. Step 1: Recall the correct module and function

    The correct function to create a thread is thread::spawn from the std::thread module.
  2. Step 2: Check syntax correctness

    let handle = thread::spawn(|| { println!("Hello"); }); uses the correct syntax: thread::spawn(|| { ... }). Other options use wrong module names or functions.
  3. Final Answer:

    let handle = thread::spawn(|| { println!("Hello"); }); -> Option A
  4. Quick Check:

    Correct syntax uses thread::spawn [OK]
Hint: Use thread::spawn with a closure to start threads [OK]
Common Mistakes:
  • Swapping module and function names
  • Missing double colons (::) in path
  • Using non-existent functions like create()
3. What will be the output of this Rust code?
use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        println!("Inside thread");
    });
    println!("Outside thread");
    handle.join().unwrap();
}
medium
A. Inside thread Outside thread
B. Outside thread Inside thread
C. Only Inside thread
D. Only Outside thread

Solution

  1. Step 1: Understand thread execution order

    The main thread prints "Outside thread" immediately. The spawned thread runs concurrently and prints "Inside thread".
  2. Step 2: Consider join() effect

    The join() waits for the spawned thread to finish, but does not change the order of prints already done.
  3. Final Answer:

    Outside thread Inside thread -> Option B
  4. Quick Check:

    Main prints first, spawned thread prints after [OK]
Hint: Main thread prints first, spawned thread runs concurrently [OK]
Common Mistakes:
  • Assuming spawned thread always prints first
  • Ignoring that join() waits but doesn't reorder prints
  • Thinking only one print appears
4. Identify the error in this Rust code that creates a thread:
use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        println!("Hello from thread");
    });
    handle.join();
}
medium
A. println! macro cannot be used inside threads.
B. thread::spawn requires a named function, not a closure.
C. join() should be called before thread::spawn.
D. Missing call to unwrap() on join() result.

Solution

  1. Step 1: Check join() usage

    The join() method returns a Result that should be handled, usually by calling unwrap() to catch panics.
  2. Step 2: Verify other statements

    The other options are incorrect: println! macro works inside threads, thread::spawn accepts closures, and join() is called after spawn.
  3. Final Answer:

    Missing call to unwrap() on join() result. -> Option D
  4. Quick Check:

    Always unwrap join() result to handle errors [OK]
Hint: Always unwrap join() to handle thread errors [OK]
Common Mistakes:
  • Ignoring join()'s Result return
  • Thinking closures can't be used in spawn
  • Calling join() before spawn
5. You want to create 3 threads that each print their thread number (1, 2, 3). Which code correctly does this without data races?
use std::thread;

fn main() {
    for i in 1..=3 {
        thread::spawn(|| {
            println!("Thread number: {}", i);
        });
    }
}
hard
A. Move i into closure: thread::spawn(move || { println!("Thread number: {}", i); });
B. Use thread::spawn(|| { println!("Thread number: {}", i); }); as is.
C. Declare i as static before loop.
D. Use thread::spawn(|| println!("Thread number: {}", i)); without move.

Solution

  1. Step 1: Understand closure capturing in threads

    The variable i changes each loop iteration. Without move, the closure captures i by reference, causing data races.
  2. Step 2: Use move to capture i by value

    Adding move moves the current value of i into the closure, making each thread print its own number safely.
  3. Final Answer:

    Move i into closure: thread::spawn(move || { println!("Thread number: {}", i); }); -> Option A
  4. Quick Check:

    Use move closures to capture loop variables safely [OK]
Hint: Use move closures to capture loop variables in threads [OK]
Common Mistakes:
  • Not using move causes all threads to print last i value
  • Trying to declare i as static (not allowed here)
  • Assuming closure captures by value without move
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard