rust 閉包與同步
rust 閉包
rust閉包中主要包括兩個部分东涡,閉包參數(shù)和閉包環(huán)境變量虹蒋。
閉包函數(shù)和函數(shù)參數(shù)使用無太大區(qū)別折柠。
閉包環(huán)境變量分為copy trait和非copy trait蚣抗。
閉包分為move閉包和非move閉包道偷。
copy trait變量玖雁,move閉包會將其單獨移植進入閉包中更扁,閉包內(nèi)可修改,外部原始變量不受影響赫冬。
copy trait變量浓镜,非move閉包會將其原始變量移植入閉包,閉包內(nèi)可修改劲厌,原始外部變量受影響膛薛。
非copy trait變量,move閉包會將其其單獨移植進入閉包补鼻,閉包內(nèi)可修改哄啄,外部原始變量失效雅任。
非copy trait變量,move閉包會將其移入閉包咨跌,閉包內(nèi)無法修改沪么,外部原始變量不失效。
#[derive(Debug)]
pub struct Person {
pub name: String,
pub age: u32,
}
pub fn clone_struct_test_1() {
let person_a = Person {
name: String::from("wenbin"),
age: 12,
};
let closure_fn = || person_a;
let person_b = closure_fn();
println!("{:?}", person_b);
// println!("{:?}",person_a);
}
pub fn clone_struct_test_1_1() {
let mut person_a = Person {
name: String::from("wenbin"),
age: 12,
};
let closure_fn = || {
let mut person_c = Person {
name: person_a.name.clone(),
age: person_a.age + 5,
};
// this will report a error
// person_a.age = 17;
person_c
};
let person_b = closure_fn();
println!("{:?}", person_b);
println!("{:?}", person_a);
}
pub fn clone_struct_test_1_2() {
let mut person_a = Person {
name: String::from("wenbin"),
age: 12,
};
let closure_fn = move || {
let mut person_c = Person {
name: person_a.name.clone(),
age: person_a.age + 5,
};
person_a.age = person_a.age + 12;
(person_c, person_a)
};
let (person_b, person_a) = closure_fn();
println!("{:?}", person_b);
println!("{:?}", person_a);
}
pub fn clone_struct_test_2() {
let mut person_a = Person {
name: String::from("wenbin"),
age: 12,
};
let closure_fn = |person_a| person_a;
let mut person_b: &mut Person = closure_fn(&mut person_a);
person_b.age = 13;
println!("{:?}", person_b);
println!("{:?}", person_a);
}
pub fn clone_struct_test_2_1() {
let mut person_a = Person {
name: String::from("wenbin"),
age: 12,
};
let closure_fn = |person_a: &mut Person| {
let mut person_c = Person {
name: person_a.name.clone(),
age: person_a.age + 23,
};
person_c
};
let mut person_b = closure_fn(&mut person_a);
println!("{:?}", person_b);
person_b.age = 13;
println!("{:?}", person_b);
println!("{:?}", person_a);
}
rust 同步
rust共享變量同步有mutex锌半,RWLock禽车,atomic。
mutex通常與arc結(jié)合拳喻,一起在多線程中使用哭当。在多線程中使用需要將arc指針進行復(fù)制。
mutex的訪問主要通過lock方法冗澈,當(dāng)前線程阻塞時钦勘,會自動釋放鎖。
mutex自動通知亚亲,在rust中提供了根據(jù)event來通知其他線程的機制condvar彻采。
// 代碼中的Condvar就是條件變量,它提供了wait方法可以主動讓當(dāng)前線程等待捌归,
// 同時提供了notify_one方法肛响,讓其他線程喚醒正在等待的線程。
// 這樣就能完美實現(xiàn)順序控制了惜索√厮瘢看起來好像條件變量把事都做完了,要Mutex干嘛呢巾兆?
// 為了防止多個線程同時執(zhí)行條件變量的wait操作猎物,
// 因為條件變量本身也是需要被保護的,這就是鎖能做角塑,而原子類型做不到的地方蔫磨。
// 例子中可以看出,condvar和mutex想綁定圃伶,體現(xiàn)在wait方法:
// started = cvar.wait(started).unwrap();
pub fn sync_test_4(){
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();
// 創(chuàng)建一個新線程
thread::spawn(move|| {
let &(ref lock, ref cvar) = &*pair2;
println!("new thread start");
let mut started = lock.lock().unwrap();
*started = true;
thread::sleep_ms(10000);
cvar.notify_one();
println!("notify main thread");
});
// 等待新線程先運行
let &(ref lock, ref cvar) = &*pair;
let mut started = lock.lock().unwrap();
while !*started {
println!("before wait");
started = cvar.wait(started).unwrap();
println!("after wait");
}
}