最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust 多線程編程的實(shí)現(xiàn)

 更新時(shí)間:2023年12月07日 11:39:32   作者:int8  
在rust中,多線程編程不算困難,但是也需要留心和別的編程語言中不同的地方,本文主要介紹了Rust 多線程編程的實(shí)現(xiàn),感興趣的可以了解一下

一個(gè)進(jìn)程一定有一個(gè)主線程,主線程之外創(chuàng)建出來的線程稱為子線程
多線程編程,其實(shí)就是在主線程之外創(chuàng)建子線程,讓子線程和主線程并發(fā)運(yùn)行,完成各自的任務(wù)。
Rust語言支持多線程編程。

Rust語言標(biāo)準(zhǔn)庫中的 std::thread 模塊用于多線程編程。
std::thread 提供很很多方法用于創(chuàng)建線程、管理線程和結(jié)束線程。

一、創(chuàng)建線程

使用std::thread::spawn()方法創(chuàng)建一個(gè)線程。

pub fn spawn<F, T>(f: F) -> JoinHandle<T>

參數(shù) f 是一個(gè)閉包,是線程要執(zhí)行的代碼。

范例

use std::thread; // 導(dǎo)入線程模塊
use std::time::Duration; // 導(dǎo)入時(shí)間模塊
fn main() {
     //創(chuàng)建一個(gè)新線程
     thread::spawn(|| {
         for i in 1..10 {
             println!("hi number {} from the spawned thread!", i);
             thread::sleep(Duration::from_millis(1));
         }
     });
     // 主線程要執(zhí)行的代碼
     for i in 1..5 {
         println!("hi number {} from the main thread!", i);
         thread::sleep(Duration::from_millis(1));
     }
}
編譯運(yùn)行結(jié)果如下
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the main thread!
hi number 2 from the spawned thread!
hi number 3 from the main thread!
hi number 3 from the spawned thread!
hi number 4 from the spawned thread!
hi number 4 from the main thread!

咦,執(zhí)行結(jié)果好像出錯(cuò)了? 是嗎?
當(dāng)主線程執(zhí)行結(jié)束,那么就會(huì)自動(dòng)關(guān)閉創(chuàng)建出來的子線程。
上面的代碼,我們調(diào)用 thread::sleep() 函數(shù)強(qiáng)制線程休眠一段時(shí)間,這就允許不同的線程交替執(zhí)行。
雖然某個(gè)線程休眠時(shí)會(huì)自動(dòng)讓出cpu,但并不保證其它線程會(huì)執(zhí)行。這取決于操作系統(tǒng)如何調(diào)度線程。
這個(gè)范例的輸出結(jié)果是隨機(jī)的,主線程一旦執(zhí)行完成程序就會(huì)自動(dòng)退出,不會(huì)繼續(xù)等待子線程。這就是子線程的輸出結(jié)果不全的原因。

二、讓主線程等待子線程

默認(rèn)情況下,主線程并不會(huì)等待子線程執(zhí)行完畢。為了避免這種情況,我們可以讓主線程等待子線程執(zhí)行完畢然后再繼續(xù)執(zhí)行。

Rust標(biāo)準(zhǔn)庫提供了 join() 方法用于把子線程加入主線程等待隊(duì)列。

spawn<F, T>(f: F) -> JoinHandle<T>

范例

use std::thread;
use std::time::Duration;
fn main() {
     let handle = thread::spawn(|| {
         for i in 1..10 {
             println!("hi number {} from the spawned thread!", i);
             thread::sleep(Duration::from_millis(1));
         }
     });
     for i in 1..5 {
         println!("hi number {} from the main thread!", i);
         thread::sleep(Duration::from_millis(1));
     }
     handle.join().unwrap();
}
編譯運(yùn)行結(jié)果如下
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the spawned thread!
hi number 2 from the main thread!
hi number 3 from the spawned thread!
hi number 3 from the main thread!
hi number 4 from the main thread!
hi number 4 from the spawned thread!
hi number 5 from the spawned thread!
hi number 6 from the spawned thread!
hi number 7 from the spawned thread!
hi number 8 from the spawned thread!
hi number 9 from the spawned thread!

從輸出結(jié)果來看,主線程和子線程交替執(zhí)行。
主線程等待子線程執(zhí)行完畢是因?yàn)檎{(diào)用了 join() 方法。

三、move強(qiáng)制所有權(quán)遷移

這是一個(gè)經(jīng)常遇到的情況:
實(shí)例

use std::thread;
fn main() {
    let s = "hello";
   
    let handle = thread::spawn(|| {
        println!("{}", s);
    });

    handle.join().unwrap();
}

在子線程中嘗試使用當(dāng)前函數(shù)的資源,這一定是錯(cuò)誤的!因?yàn)樗袡?quán)機(jī)制禁止這種危險(xiǎn)情況的產(chǎn)生,它將破壞所有權(quán)機(jī)制銷毀資源的一定性。我們可以使用閉包的move關(guān)鍵字來處理:
實(shí)例

use std::thread;
fn main() {
    let s = "hello";
   
    let handle = thread::spawn(move || {
        println!("{}", s);
    });

    handle.join().unwrap();
}

四、消息傳遞

使用通道傳遞消息,通道有兩部分組成,一個(gè)發(fā)送者(transmitter)和一個(gè)接收者(receiver)。
std::sync::mpsc包含了消息傳遞的方法:
實(shí)例

use std::thread;
use std::sync::mpsc;
fn main() {
    let (tx, rx) = mpsc::channel();
    thread::spawn(move || {
        let val = String::from("hi");
        tx.send(val).unwrap();
    });
    let received = rx.recv().unwrap();
    println!("Got: {}", received);
}
運(yùn)行結(jié)果:
Got: hi

子線程獲得了主線程的發(fā)送者tx,并調(diào)用了它的send方法發(fā)送了一個(gè)字符串,然后主線程就通過對應(yīng)的接收者rx接收到了。

到此這篇關(guān)于Rust 多線程編程的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Rust 多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解在Rust語言中如何聲明可變的static類型變量

    詳解在Rust語言中如何聲明可變的static類型變量

    在Rust中,可以使用lazy_static宏來聲明可變的靜態(tài)變量,lazy_static是一個(gè)用于聲明延遲求值靜態(tài)變量的宏,本文將通過一個(gè)簡單的例子,演示如何使用?lazy_static?宏來聲明一個(gè)可變的靜態(tài)變量,需要的朋友可以參考下
    2023-08-08
  • Rust中的宏之聲明宏和過程宏詳解

    Rust中的宏之聲明宏和過程宏詳解

    Rust中的宏是一種強(qiáng)大的工具,可以幫助開發(fā)人員編寫可重用、高效和靈活的代碼,這篇文章主要介紹了Rust中的宏:聲明宏和過程宏,需要的朋友可以參考下
    2023-04-04
  • Rust如何使用config配置API

    Rust如何使用config配置API

    這篇文章主要介紹了Rust如何使用config配置API,這里記錄了如何聲明配置類型,讀取配置,通過環(huán)境變量來覆蓋配置值等開發(fā)中常見的動(dòng)作,需要的朋友可以參考下
    2023-11-11
  • Rust中HashMap類型的使用詳解

    Rust中HashMap類型的使用詳解

    Rust中一種常見的集合類型是哈希映射,本文主要介紹了Rust中HashMap類型的使用詳解,包含創(chuàng)建訪問修改遍歷等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 如何使用Rust直接編譯單個(gè)的Solidity合約

    如何使用Rust直接編譯單個(gè)的Solidity合約

    本文介紹了如何使用Rust語言直接編譯Solidity智能合約,特別適用于沒有外部依賴或flatten后的合約,一般情況下,Solidity開發(fā)者使用Hardhat或Foundry框架,本文給大家介紹如何使用Rust直接編譯單個(gè)的Solidity合約,感興趣的朋友一起看看吧
    2024-09-09
  • Rust使用csv crate構(gòu)建CSV文件讀取器的全過程

    Rust使用csv crate構(gòu)建CSV文件讀取器的全過程

    這篇文章主要學(xué)習(xí)如何基于Rust使用csv這個(gè)crate構(gòu)建一個(gè)CSV文件讀取器的過程,學(xué)習(xí)了csv相關(guān)的用法以及一些往期學(xué)過的crate的復(fù)習(xí),兼顧了實(shí)用性和Rust的學(xué)習(xí),需要的朋友可以參考下
    2024-05-05
  • Rust語言之結(jié)構(gòu)體和枚舉的用途與高級功能詳解

    Rust語言之結(jié)構(gòu)體和枚舉的用途與高級功能詳解

    Rust 是一門注重安全性和性能的現(xiàn)代編程語言,其中結(jié)構(gòu)體和枚舉是其強(qiáng)大的數(shù)據(jù)類型之一,了解結(jié)構(gòu)體和枚舉的概念及其高級功能,將使你能夠更加靈活和高效地處理數(shù)據(jù),本文將深入探討 Rust 中的結(jié)構(gòu)體和枚舉,并介紹它們的用途和高級功能
    2023-10-10
  • Rust實(shí)現(xiàn)grep命令行工具的方法

    Rust實(shí)現(xiàn)grep命令行工具的方法

    這篇文章主要介紹了Rust實(shí)現(xiàn)grep命令行工具的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 從零開始使用Rust編寫nginx(TLS證書快過期了)

    從零開始使用Rust編寫nginx(TLS證書快過期了)

    wmproxy已用Rust實(shí)現(xiàn)http/https代理,?socks5代理,?反向代理,?負(fù)載均衡,?靜態(tài)文件服務(wù)器,websocket代理,四層TCP/UDP轉(zhuǎn)發(fā),內(nèi)網(wǎng)穿透等,本文給大家介紹從零開始使用Rust編寫nginx(TLS證書快過期了),感興趣的朋友一起看看吧
    2024-03-03
  • Rust練習(xí)冊之字母異位詞與字符串處理方法技巧

    Rust練習(xí)冊之字母異位詞與字符串處理方法技巧

    Rust作為一種系統(tǒng)編程語言,其在字符串拼接方面的設(shè)計(jì)既靈活又高效,這篇文章主要介紹了Rust練習(xí)冊之字母異位詞與字符串處理方法技巧的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-02-02

最新評論

台中市| 乡城县| 道孚县| 澎湖县| 河北区| 台山市| 刚察县| 兴安盟| 海南省| 永济市| 霍邱县| 林口县| 政和县| 聂拉木县| 西乡县| 石城县| 微博| 桦南县| 南陵县| 京山县| 灵川县| 古蔺县| 伽师县| 河曲县| 万荣县| 汽车| 岫岩| 贺兰县| 新竹市| 汉中市| 滨海县| 泸西县| 磐安县| 安图县| 林西县| 轮台县| 兰考县| 宜兰县| 新干县| 灵川县| 桃园县|