我有這段代碼:
let mut is_ok_test = false;
let handle = thread::spawn(move || {
is_ok_test = true;
});
handle.join().unwrap();
if is_ok_test == true { println!("Success"); } else { println!("Test Failed") }
該is_ok_test變數始終保持為假。我不明白為什么。
修改里面的變數時,我收到這樣的警告:
value assigned to `is_ok_test` is never read
maybe it is overwritten before being read?
unused variable: `is_ok_test`
did you mean to capture by reference instead?
我試圖添加&但它不起作用。
uj5u.com熱心網友回復:
@cafce25 的答案是正確的,但另一種方法是使用scoped thread,因為您在檢查之前加入了執行緒is_ok_test:
let mut is_ok_test = false;
thread::scope(|s| {
s.spawn(|| {
is_ok_test = true;
});
});
if is_ok_test == true {
println!("Success");
} else {
println!("Test Failed")
}
作用域執行緒可以從外部函式捕獲變數(注意沒有move)。
uj5u.com熱心網友回復:
問題在于,由于move || {...and 布林值Copy不是更改外部布林值,而是在閉包內創建了它的副本。這也是您的警告所指的內容,is_ok永遠不會閱讀內部內容。
您可以通過使用Arc. 要恢復可變性,您可以使用AtomicBool:
use std::sync::Arc;
use std::sync::atomic::AtomicBool;
use std::sync::atomic::Ordering::Relaxed;
fn main() {
let mut is_ok_test = Arc::new(AtomicBool::new(false));
let handle = {
let is_ok_test = is_ok_test.clone();
std::thread::spawn(move || {
is_ok_test.store(true, Relaxed);
})
};
handle.join().unwrap();
if is_ok_test.load(Relaxed) == true { println!("Success"); } else { eprintln!("Test Failed") }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/535804.html
標籤:多线程锈
