gpt4 book ai didi

rust - 为什么Mutex中的计数器与计数器的增量不一致?

转载 作者:行者123 更新时间:2023-12-03 11:43:11 24 4
gpt4 key购买 nike

当我练习代码时,学习如何在多个线程中锁定和解锁互斥锁。我使用for循环运行10个不同的线程,并启动了一个互斥锁计数器变量。 for循环的实际增量很好,但与互斥锁计数器不一致。

let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];

for _ in 0..10 {
let counter = Arc::clone(&counter);
println!("Result: {:?}", counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Result: {}", *counter.lock().unwrap());

输出在互斥量计数器中显示了一些荒谬的结果,我需要知道为什么会发生这种情况?
Result: Mutex { data: 0 } 
Result: Mutex { data: 0 }
Result: Mutex { data: 1 }
Result: Mutex { data: 2 }
Result: Mutex { data: 3 }
Result: Mutex { data: 4 }
Result: Mutex { data: 5 }
Result: Mutex { data: 6 }
Result: Mutex { data: 6 }
Result: Mutex { data: 8 }
Result: 10

最佳答案

您正在主线程中打印结果,该主线程与其他线程并行运行,因此无法为您提供确定的结果。如果在互斥锁被锁定之后,将结果打印在生成的线程中(以确保一次只有一个线程看到该值),您将获得更合理的结果:

let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];

for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
println!("Result: {:?}", num);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Result: {}", *counter.lock().unwrap());

输出:
Result: 1
Result: 2
Result: 3
Result: 4
Result: 5
Result: 6
Result: 7
Result: 8
Result: 9
Result: 10
Result: 10

关于rust - 为什么Mutex中的计数器与计数器的增量不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61830192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com