Skip to content

Threads2 wrong solution possible #2200

Open

Description

@TheBlackArroVV

It is possible to pass threads2 without actually solving a task. Following code will make it great and allow to pass while being wrong. Maybe worth discarding as you can still get it by matching with expected result(10) and checking solution file

use std::{sync::Arc, thread, time::Duration};

#[derive(Clone)]
struct JobStatus {
    jobs_done: u32,
}

fn main() {
    // TODO: `Arc` isn't enough if you want a **mutable** shared state.
    let status = Arc::new(JobStatus { jobs_done: 0 });

    let mut handles = Vec::new();
    for _ in 0..10 {
        let mut status_shared = Arc::clone(&status);
        let handle = thread::spawn(move || {
            thread::sleep(Duration::from_millis(250));

            // TODO: You must take an action before you update a shared value.
            Arc::make_mut(&mut status_shared).jobs_done += 1;
        });
        handles.push(handle);
    }

    // Waiting for all jobs to complete.
    for handle in handles {
        handle.join().unwrap();
    }

    // TODO: Print the value of `JobStatus.jobs_done`.
    println!("Jobs done: {}", status.jobs_done);
}

Activity

  1. simon-liebehenschel commented on Sep 15, 2025

    @simon-liebehenschel

    I think there are too many ways to pass the task. Here is another (most likely "wrong") solution:

    fn main() {
        let status = Arc::new(Mutex::new(JobStatus { jobs_done: 0 }));
    
        let mut handles = Vec::new();
        for _ in 0..10 {
            let status_shared = Arc::clone(&status);
            let handle = thread::spawn(move || {
                thread::sleep(Duration::from_millis(250));
    
                // Modify the locked jobs directly
                let mut jobs = status_shared.lock().unwrap();
                jobs.jobs_done += 1;  // Use 'jobs', not 'status_shared'
            });
            handles.push(handle);
        }
    
        // Waiting for all jobs to complete.
        for handle in handles {
            handle.join().unwrap();
        }
    
        // Print the value of `JobStatus.jobs_done`.
        println!("Jobs done: {}", status.lock().unwrap().jobs_done);
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions