rust 多线程下的条件锁例子

原创
2020/06/29 18:56
阅读数 601

这是官方给的例子,稍微修改了一下。 notify_one() 不会阻塞。 wait() 会阻塞。

use std::collections::HashMap;
use log::info;

fn main() {
    use std::sync::{Arc, Mutex, Condvar};
    use std::thread;

    let pair = Arc::new((Mutex::new(false), Condvar::new()));
    let pair2 = pair.clone();
    thread::spawn(move || {
        loop {
            thread::sleep(std::time::Duration::from_secs(4));
            let (lock, cvar) = &*pair2;
            let mut started = lock.lock().unwrap();
            //*started = true;
            cvar.notify_all(); // 非阻塞通知,notify 有一个队列,过多的通知会被抛弃。notify 以后,需要重新 lock() 才能继续 notify()
            println!("notify_all()");
        }
    });

    for i in 0..2 {
        let pair2 = pair.clone();
        thread::spawn(move || {
            loop {
                // 注意 lock 要及时释放,否则会导致其他线程锁住。
                {
                    let (lock, cvar) = &*pair2;
                    let mut started = lock.lock().unwrap();
                    println!("waiting...{}", i);
                    let r = cvar.wait(started);
                    started = r.unwrap(); // wait() 会释放掉 mutex lock!
                    println!("waked: {}", i);
                    // thread::sleep(std::time::Duration::from_secs(2)); // 这里会产生互斥,通知会被挨个执行。
                }
                thread::sleep(std::time::Duration::from_secs(2)); // 由于互斥锁在前面生命周期结束释放,所以会兵法执行到这里,看起来像是惊群。
            }
        });
    }

    thread::park();
}

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部