第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何將對堆棧變量的引用傳遞給線程?

如何將對堆棧變量的引用傳遞給線程?

如何將對堆棧變量的引用傳遞給線程?我正在編寫一個(gè)WebSocket服務(wù)器,其中一個(gè)Web客戶端連接到一個(gè)多線程計(jì)算機(jī)AI上下棋。WebSocket服務(wù)器希望傳遞一個(gè)Logger對象進(jìn)入人工智能代碼。這個(gè)Logger對象將把日志行從AI排到Web客戶端。這個(gè)Logger必須包含對客戶端連接的引用。我對生命如何與線程交互感到困惑。我用一個(gè)Wrapper由類型參數(shù)化的結(jié)構(gòu)。這個(gè)run_thread函數(shù)嘗試展開該值并將其記錄下來。use std::fmt::Debug;use std::thread;struct Wrapper<T: Debug> {     val: T,}fn run_thread<T: Debug>(wrapper: Wrapper<T>) {     let thr = thread::spawn(move || {         println!("{:?}", wrapper.val);     });     thr.join();}fn main() {     run_thread(Wrapper::<i32> { val: -1 });}這個(gè)wrapper參數(shù)存在于堆棧中,且其生存期不會延長。run_thread的堆??蚣埽词乖诙褩Y(jié)束之前線程將被連接。我可以從堆棧中復(fù)制值:use std::fmt::Debug;use std::thread;struct Wrapper<T: Debug + Send> {     val: T,}fn run_thread<T: Debug + Send + 'static>(wrapper: Wrapper<T>) {     let thr = thread::spawn(move || {         println!("{:?}", wrapper.val);     });     thr.join();}fn main() {     run_thread(Wrapper::<i32> { val: -1 });}如果T是對一個(gè)我不想復(fù)制的大對象的引用:use std::fmt::Debug;use std::thread;struct Wrapper<T: Debug + Send> {     val: T,}fn run_thread<T: Debug + Send + 'static>(wrapper: Wrapper<T>) {     let thr = thread::spawn(move || {         println!("{:?}", wrapper.val);     });     thr.join();}fn main() {     let mut v = Vec::new();     for i in 0..1000 {         v.push(i);     }     run_thread(Wrapper { val: &v });}其結(jié)果是:error: `v` does not live long enough   --> src/main.rs:22:32    | 22 |     run_thread(Wrapper { val: &v });    |                                ^ does not live long enough 23 | }    | - borrowed value only lives until here    |    = note: borrowed value must be valid for the static lifetime...在我真正的程序中,看起來兩個(gè)Logger連接對象必須放置在Arc包裝紙??蛻舳吮灰髮⑦B接放在Arc當(dāng)代碼被并行化時(shí),代碼是庫內(nèi)部的。這尤其令人討厭,因?yàn)檫B接的生存期肯定大于工作線程的生存期。我錯(cuò)過了什么嗎?
查看完整描述

2 回答

?
隔江千里

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊

標(biāo)準(zhǔn)庫中的線程支持允許創(chuàng)建的線程比創(chuàng)建線程的線程更長;這是一件好事!但是,如果要將對堆棧分配變量的引用傳遞給這些線程之一,則無法保證該變量在線程執(zhí)行時(shí)仍然有效。在其他語言中,這將允許線程訪問無效內(nèi)存,從而產(chǎn)生大量內(nèi)存安全問題。

幸運(yùn)的是,我們并不局限于標(biāo)準(zhǔn)庫。至少有兩個(gè)箱子作用域螺紋-保證在某個(gè)作用域結(jié)束之前退出的線程。這可以確保堆棧變量在線程的整個(gè)期間都可用:

還有一些板條箱可以抽象出“線程”的底層細(xì)節(jié),但允許您完成目標(biāo):

下面是每一個(gè)例子。每個(gè)示例生成大量線程,并在沒有鎖定、沒有鎖定的情況下對本地向量進(jìn)行變異。Arc也沒有克隆。請注意,該突變具有sleep調(diào)用以幫助驗(yàn)證這些呼叫是并行進(jìn)行的。

您可以擴(kuò)展這些示例,以共享對實(shí)現(xiàn)的任何類型的引用。Sync,如Mutex或者Atomic*..然而,使用這些將引入鎖定。

范圍-線程池

use scoped_threadpool::Pool; // 0.1.9use std::{thread, time::Duration};fn main() {
    let mut vec = vec![1, 2, 3, 4, 5];
    let mut pool = Pool::new(vec.len() as u32);

    pool.scoped(|scoped| {
        for e in &mut vec {
            scoped.execute(move || {
                thread::sleep(Duration::from_secs(1));
                *e += 1;
            });
        }
    });

    println!("{:?}", vec);}

橫梁

use crossbeam; // 0.6.0use std::{thread, time::Duration};fn main() {
    let mut vec = vec![1, 2, 3, 4, 5];

    crossbeam::scope(|scope| {
        for e in &mut vec {
            scope.spawn(move |_| {
                thread::sleep(Duration::from_secs(1));
                *e += 1;
            });
        }
    })
    .expect("A child thread panicked");

    println!("{:?}", vec);}

人造絲

use rayon::iter::{IntoParallelRefMutIterator, ParallelIterator}; // 1.0.3use std::{thread, time::Duration};fn main() {
    let mut vec = vec![1, 2, 3, 4, 5];

    vec.par_iter_mut().for_each(|e| {
        thread::sleep(Duration::from_secs(1));
        *e += 1;
    });

    println!("{:?}", vec);}

客戶端必須將連接放在Arc當(dāng)代碼被并行化時(shí),代碼是庫內(nèi)部的。

也許你能更好地隱藏你的并行性?您能否接受記錄器,然后將其包裝在Arc / Mutex在把它交給你的線程之前?


查看完整回答
反對 回復(fù) 2019-06-25
?
慕森王

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超3個(gè)贊

我的解決辦法是Logger實(shí)施Clone,并有一個(gè)類型為Arc<Mutex<Connection>>..然后,用戶可以將記錄器的一個(gè)克隆傳遞給線程代碼。用戶無法轉(zhuǎn)移Connection對于線程代碼(用戶需要它用于其他目的),因此我認(rèn)為線程代碼不可能方便地執(zhí)行Arc并代表用戶進(jìn)行裝箱。 

查看完整回答
反對 回復(fù) 2019-06-25
  • 2 回答
  • 0 關(guān)注
  • 601 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號