Skip to content

play.rust-lang.org example for Mutex pulls up source for Mutex and Poisoning together #22523

Closed

Description

@elbow-jason

http://doc.rust-lang.org/std/sync/struct.Mutex.html#examples

Clicking on the link that leads to play.rust-lang.org loads the source for both Mutex and Poisoning in the same playground. The following is a sample from the playground (notice the two fn mains) :

   fn main() {
        use std::sync::{Arc, Mutex};
        use std::thread::Thread;
        use std::sync::mpsc::channel;

        const N: uint = 10;

        // Spawn a few threads to increment a shared variable (non-atomically), and
        // let the main thread know once all increments are done.
        //
        // Here we're using an Arc to share memory among tasks, and the data inside
        // the Arc is protected with a mutex.
        let data = Arc::new(Mutex::new(0));

        let (tx, rx) = channel();
        for _ in 0u..10 {
            let (data, tx) = (data.clone(), tx.clone());
            Thread::spawn(move || {
                // The shared static can only be accessed once the lock is held.
                // Our non-atomic increment is safe because we're the only thread
                // which can access the shared state when the lock is held.
                //
                // We unwrap() the return value to assert that we are not expecting
                // tasks to ever fail while holding the lock.
                let mut data = data.lock().unwrap();
                *data += 1;
                if *data == N {
                    tx.send(()).unwrap();
                }
                // the lock is unlocked here when `data` goes out of scope.
            });
        }

        rx.recv().unwrap();
    }fn main() {
        use std::sync::{Arc, Mutex};
        use std::thread::Thread;

        let lock = Arc::new(Mutex::new(0u));
        let lock2 = lock.clone();

        let _ = Thread::scoped(move || -> () {
            // This thread will acquire the mutex first, unwrapping the result of
            // `lock` because the lock has not been poisoned.
            let _lock = lock2.lock().unwrap();

            // This panic while holding the lock (`_guard` is in scope) will poison
            // the mutex.
            panic!();
        }).join();

        // The lock is poisoned by this point, but the returned result can be
        // pattern matched on to return the underlying guard on both branches.
        let mut guard = match lock.lock() {
            Ok(guard) => guard,
            Err(poisoned) => poisoned.into_guard(),
        };

        *guard += 1;
    }

Activity

  1. elbow-jason commented on Feb 19, 2015

    @elbow-jason
    Author

    Additionally, the "To recover from a poisoned mutex:" example below pulls up the code from the example itself (the code that should have been pulled up by clicking the first mutex example).

  2. alexcrichton commented on Apr 7, 2015

    @alexcrichton
    Member

    I believe this was fixed in the interim, yay!

  3. added a commit that references this issue on Jun 8, 2026
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

    T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions