在多线程中使用不带Arc的Mutex是否安全?

时间:2018-11-21 10:20:19

标签: multithreading rust

lazy_static! {
    pub static ref A: Mutex<Vec<u8>> = Mutex::new(vec![]);
}

#[test]
fn test() {
    let mut handles = vec![];
    for _ in 0..100 {
        let handle = thread::spawn(|| for _ in 0..10000 { A.lock().unwrap().push(1); });
        handles.push(handle);
    }

    for handle in handles { handle.join().unwrap(); }
    println!("{}", A.lock().unwrap().len());
}

我得到的输出是1000000,但是我不确定这是否是在多线程中收集data的正确方法。

我应该将其更改为Arc<Mutex<_>>吗?

1 个答案:

答案 0 :(得分:1)

这是安全的,是的。多线程正是互斥的目的。 Arc不能满足您的任何需求。

当然,请注意,您当前的代码效率极低。希望您的实际用例在互斥锁之间做的工作比这更多。