rust 閉包與同步

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");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堤如,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子窒朋,更是在濱河造成了極大的恐慌搀罢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侥猩,死亡現(xiàn)場離奇詭異魄揉,居然都是意外死亡,警方通過查閱死者的電腦和手機拭宁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門洛退,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓣俯,“玉大人,你說我怎么就攤上這事兵怯〔守埃” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵媒区,是天一觀的道長驼仪。 經(jīng)常有香客問我,道長袜漩,這世上最難降的妖魔是什么绪爸? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宙攻,結(jié)果婚禮上奠货,老公的妹妹穿的比我還像新娘。我一直安慰自己座掘,他們只是感情好递惋,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溢陪,像睡著了一般萍虽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上形真,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天杉编,我揣著相機與錄音,去河邊找鬼咆霜。 笑死王财,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裕便。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼见咒,長吁一口氣:“原來是場噩夢啊……” “哼偿衰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起改览,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤下翎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宝当,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體视事,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年庆揩,在試婚紗的時候發(fā)現(xiàn)自己被綠了俐东。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跌穗。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虏辫,靈堂內(nèi)的尸體忽然破棺而出蚌吸,到底是詐尸還是另有隱情,我是刑警寧澤砌庄,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布羹唠,位于F島的核電站,受9級特大地震影響娄昆,放射性物質(zhì)發(fā)生泄漏佩微。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一萌焰、第九天 我趴在偏房一處隱蔽的房頂上張望哺眯。 院中可真熱鬧,春花似錦杆怕、人聲如沸族购。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寝杖。三九已至,卻和暖如春互纯,著一層夾襖步出監(jiān)牢的瞬間瑟幕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工留潦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留只盹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓兔院,卻偏偏與公主長得像殖卑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子坊萝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354