Bird
Raised Fist0
Rustprogramming~20 mins

Threads overview in Rust - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Rust Threads Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this Rust thread code?

Consider the following Rust program that creates a thread and prints a message. What will it print?

Rust
use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        println!("Hello from the thread!");
    });
    handle.join().unwrap();
    println!("Hello from the main thread!");
}
AHello from the main thread!\nHello from the thread!
BHello from the thread!\nHello from the main thread!
CHello from the thread!
DHello from the main thread!
Attempts:
2 left
💡 Hint

Remember that join() waits for the thread to finish before continuing.

🧠 Conceptual
intermediate
1:30remaining
Which statement about Rust threads is true?

Choose the correct statement about Rust threads.

ARust threads require explicit synchronization to share data safely.
BRust threads automatically clone all variables from the main thread.
CRust threads cannot be joined once spawned.
DRust threads share memory by default without any safety checks.
Attempts:
2 left
💡 Hint

Think about Rust's ownership and safety guarantees.

🔧 Debug
advanced
2:30remaining
What error does this Rust thread code produce?

Examine the code below. What error will the Rust compiler report?

Rust
use std::thread;

fn main() {
    let v = vec![1, 2, 3];
    let handle = thread::spawn(|| {
        println!("{:?}", v);
    });
    handle.join().unwrap();
}
ANo error, prints [1, 2, 3]
Berror: use of moved value `v`
Cerror: closure may outlive the current function, but it borrows `v`, which is owned by the current function
Derror: expected `FnOnce` closure, found `FnMut` closure
Attempts:
2 left
💡 Hint

Think about how closures capture variables and thread lifetimes.

❓ Predict Output
advanced
2:00remaining
What is the output of this Rust thread code with move closure?

What will this Rust program print?

Rust
use std::thread;

fn main() {
    let v = vec![10, 20, 30];
    let handle = thread::spawn(move || {
        println!("{:?}", v);
    });
    handle.join().unwrap();
}
Aerror: use of moved value `v`
Berror: closure does not implement `FnOnce`
C[]
D[10, 20, 30]
Attempts:
2 left
💡 Hint

Consider what the move keyword does to variable capture.

🧠 Conceptual
expert
1:30remaining
Which Rust synchronization primitive allows multiple threads to read but only one to write at a time?

Choose the synchronization primitive that permits multiple readers or one writer concurrently.

ARwLock
BAtomicBool
CMutex
DCondvar
Attempts:
2 left
💡 Hint

Think about read-write locks.

Practice

(1/5)
1. What is the main purpose of using threads in Rust?
easy
A. To make the program run slower
B. To avoid using variables
C. To write code without functions
D. To run multiple parts of a program at the same time

Solution

  1. Step 1: Understand what threads do

    Threads allow a program to perform multiple tasks simultaneously, improving efficiency.
  2. Step 2: Match purpose with options

    Only To run multiple parts of a program at the same time correctly states that threads run parts of a program at the same time.
  3. Final Answer:

    To run multiple parts of a program at the same time -> Option D
  4. Quick Check:

    Threads = run tasks simultaneously [OK]
Hint: Threads let programs do many things at once [OK]
Common Mistakes:
  • Thinking threads slow down the program
  • Confusing threads with functions
  • Believing threads remove variables
2. Which of the following is the correct way to start a new thread in Rust?
easy
A. thread::start(|| println!("Hello"));
B. thread::spawn(|| println!("Hello"));
C. thread::run(|| println!("Hello"));
D. thread::create(|| println!("Hello"));

Solution

  1. Step 1: Recall Rust thread syntax

    Rust uses thread::spawn to create a new thread.
  2. Step 2: Compare options with correct syntax

    Only thread::spawn(|| println!("Hello")); uses thread::spawn correctly.
  3. Final Answer:

    thread::spawn(|| println!("Hello")); -> Option B
  4. Quick Check:

    Start thread = thread::spawn [OK]
Hint: Use thread::spawn to start threads in Rust [OK]
Common Mistakes:
  • Using thread::start instead of spawn
  • Using thread::run or thread::create which don't exist
  • Missing the closure syntax ||
3. What will the following Rust code print?
use std::thread;

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

Solution

  1. Step 1: Understand thread::spawn and join

    The thread prints "Inside thread". The main thread waits for it to finish using join().
  2. Step 2: Determine print order

    Because join() waits, "Inside thread" prints first, then "Thread finished" prints.
  3. Final Answer:

    Inside thread Thread finished -> Option A
  4. Quick Check:

    join() waits, so inside thread prints before main [OK]
Hint: join() waits for thread, so thread prints before main continues [OK]
Common Mistakes:
  • Assuming main prints first without waiting
  • Ignoring join() effect
  • Expecting only one print line
4. Identify the error in this Rust code that uses threads:
use std::thread;

fn main() {
    let handle = thread::spawn(|| {
        println!("Hello from thread");
    });
    println!("Main thread");
}
medium
A. Missing call to join(), so main may end before thread finishes
B. thread::spawn is used incorrectly
C. println! macro is used wrong
D. No error, code runs perfectly

Solution

  1. Step 1: Check thread usage

    The code starts a thread but does not wait for it to finish with join().
  2. Step 2: Understand consequences

    Without join(), the main thread may finish and exit before the spawned thread prints.
  3. Final Answer:

    Missing call to join(), so main may end before thread finishes -> Option A
  4. Quick Check:

    Always join threads to ensure they complete [OK]
Hint: Always join threads to wait for their completion [OK]
Common Mistakes:
  • Forgetting to call join()
  • Thinking thread::spawn syntax is wrong
  • Assuming println! is incorrect
5. You want to run two threads that each print a message, then print "Done" after both finish. Which code correctly does this?
hard
A. thread::spawn(|| println!("Thread 1")).join().unwrap(); thread::spawn(|| println!("Thread 2")); println!("Done");
B. let t1 = thread::spawn(|| println!("Thread 1")); let t2 = thread::spawn(|| println!("Thread 2")); println!("Done");
C. let t1 = thread::spawn(|| println!("Thread 1")); let t2 = thread::spawn(|| println!("Thread 2")); t1.join().unwrap(); t2.join().unwrap(); println!("Done");
D. thread::spawn(|| println!("Thread 1")); thread::spawn(|| println!("Thread 2")); thread::spawn(|| println!("Done"));

Solution

  1. Step 1: Understand thread creation and waiting

    To ensure "Done" prints after both threads finish, we must join both threads before printing.
  2. Step 2: Analyze options for correct join usage

    let t1 = thread::spawn(|| println!("Thread 1")); let t2 = thread::spawn(|| println!("Thread 2")); t1.join().unwrap(); t2.join().unwrap(); println!("Done"); creates two threads, joins both, then prints "Done". This guarantees order.
  3. Final Answer:

    let t1 = thread::spawn(|| println!("Thread 1")); let t2 = thread::spawn(|| println!("Thread 2")); t1.join().unwrap(); t2.join().unwrap(); println!("Done"); -> Option C
  4. Quick Check:

    Join all threads before final print to ensure order [OK]
Hint: Join all threads before final action to ensure completion [OK]
Common Mistakes:
  • Not joining threads before printing "Done"
  • Joining threads immediately after spawn (serializing)
  • Spawning extra thread for "Done" message
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