about summary refs log tree commit diff
path: root/compiler/rustc_llvm/llvm-wrapper
diff options
context:
space:
mode:
authorAleksey Kladov <aleksey.kladov@gmail.com>2021-02-27 19:07:19 +0300
committerAleksey Kladov <aleksey.kladov@gmail.com>2021-02-27 19:21:50 +0300
commitd94b4e81e4ce8bc21c192ed928f33991ffe78365 (patch)
tree756ebf87c58cbe44c7bc1c88dfc2f4aca2318aa6 /compiler/rustc_llvm/llvm-wrapper
parent0846043440b480e4bbf36ac19db3948f0c835bb1 (diff)
downloadrust-d94b4e81e4ce8bc21c192ed928f33991ffe78365.tar.gz
rust-d94b4e81e4ce8bc21c192ed928f33991ffe78365.zip
clarify RW lock's priority gotcha
In particular, the following program works on Linux, but deadlocks on
mac:

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

    fn main() {
        let lock = Arc::new(RwLock::new(()));

        let r1 = thread::spawn({
            let lock = Arc::clone(&lock);
            move || {
                let _rg = lock.read();
                eprintln!("r1/1");
                sleep(1000);

                let _rg = lock.read();
                eprintln!("r1/2");

                sleep(5000);
            }
        });
        sleep(100);
        let w = thread::spawn({
            let lock = Arc::clone(&lock);
            move || {
                let _wg = lock.write();
                eprintln!("w");
            }
        });
        sleep(100);
        let r2 = thread::spawn({
            let lock = Arc::clone(&lock);
            move || {
                let _rg = lock.read();
                eprintln!("r2");
                sleep(2000);
            }
        });

        r1.join().unwrap();
        r2.join().unwrap();
        w.join().unwrap();
    }

    fn sleep(ms: u64) {
        std::thread::sleep(Duration::from_millis(ms))
    }
Diffstat (limited to 'compiler/rustc_llvm/llvm-wrapper')
0 files changed, 0 insertions, 0 deletions