目錄
學(xué)前一問(wèn):Rust為何而出現(xiàn)?
摘要
引言
正文解析:
一、Rust中的并發(fā)編程基礎(chǔ)
1.1 線程
1.2 協(xié)程
二、Rust并發(fā)編程的高級(jí)特性
2.1 通道
2.2 原子操作
2.3 鎖
三、實(shí)例展示:優(yōu)化并發(fā)編程性能
1. 并行計(jì)算
2. 異步IO
3. 數(shù)據(jù)并行
四、并發(fā)編程的挑戰(zhàn)與最佳實(shí)踐
結(jié)論:
參考文獻(xiàn):
學(xué)前一問(wèn):Rust為何而出現(xiàn)?
Rust是一門現(xiàn)代的系統(tǒng)編程語(yǔ)言,它的設(shè)計(jì)目標(biāo)是提供安全性、并發(fā)性和高性能。Rust的出現(xiàn)是為了解決其他編程語(yǔ)言在這些方面存在的一些問(wèn)題和挑戰(zhàn)。下面是一些導(dǎo)致Rust出現(xiàn)的主要原因:
內(nèi)存安全問(wèn)題:傳統(tǒng)的系統(tǒng)編程語(yǔ)言(如C和C++)給程序員提供了靈活性和低級(jí)控制能力,但也容易導(dǎo)致內(nèi)存安全問(wèn)題,如空指針引用、緩沖區(qū)溢出和數(shù)據(jù)競(jìng)爭(zhēng)。這些問(wèn)題可能導(dǎo)致程序崩潰、安全漏洞甚至惡意攻擊。Rust通過(guò)引入所有權(quán)、借用和生命周期的概念,以及靜態(tài)內(nèi)存管理和線程安全性的保證,解決了這些問(wèn)題,使得編寫(xiě)安全、可靠的系統(tǒng)級(jí)代碼更加容易。
并發(fā)編程挑戰(zhàn):隨著計(jì)算機(jī)系統(tǒng)的發(fā)展,多核處理器和并發(fā)編程變得越來(lái)越普遍。然而,傳統(tǒng)的并發(fā)編程在處理共享數(shù)據(jù)和線程同步時(shí)存在困難,如數(shù)據(jù)競(jìng)爭(zhēng)、死鎖和饑餓等問(wèn)題。Rust通過(guò)引入所有權(quán)和借用的概念,以及內(nèi)置的線程安全性保證,使得編寫(xiě)并發(fā)程序更加安全和簡(jiǎn)單。
性能要求:系統(tǒng)級(jí)編程通常需要高性能和低級(jí)別的控制能力。然而,一些高級(jí)語(yǔ)言在性能方面存在一些限制,如垃圾回收開(kāi)銷、運(yùn)行時(shí)開(kāi)銷等。Rust通過(guò)在編譯時(shí)執(zhí)行內(nèi)存管理、零成本抽象和強(qiáng)大的優(yōu)化能力,提供了與C/C++相媲美的性能,同時(shí)保持了高級(jí)語(yǔ)言的安全性和開(kāi)發(fā)效率。
綜上,Rust的出現(xiàn)是為了解決傳統(tǒng)系統(tǒng)編程語(yǔ)言的安全性、并發(fā)性和性能方面的問(wèn)題。它致力于成為一門現(xiàn)代化、安全性保證的系統(tǒng)編程語(yǔ)言,適用于各種應(yīng)用領(lǐng)域,包括操作系統(tǒng)、嵌入式系統(tǒng)、網(wǎng)絡(luò)服務(wù)和大規(guī)模分布式系統(tǒng)等。
摘要
Rust作為一門現(xiàn)代的系統(tǒng)級(jí)編程語(yǔ)言,提供了強(qiáng)大的并發(fā)編程能力。本文將介紹Rust中的并發(fā)編程概念,包括線程、協(xié)程和通道等核心概念,以及Rust提供的豐富的并發(fā)原語(yǔ)和工具。通過(guò)實(shí)例展示,我們將深入探討如何在Rust中實(shí)現(xiàn)高效的并發(fā)編程,以提升程序的性能和響應(yīng)速度。
引言
在當(dāng)今多核處理器和分布式系統(tǒng)的時(shí)代,充分利用計(jì)算資源和實(shí)現(xiàn)高性能的并發(fā)編程成為了軟件開(kāi)發(fā)中的重要課題。Rust作為一門內(nèi)存安全且具有高性能的編程語(yǔ)言,為開(kāi)發(fā)者提供了豐富的并發(fā)編程工具和原語(yǔ)。通過(guò)正確地使用Rust的并發(fā)編程特性,我們能夠編寫(xiě)出高效、安全且易于維護(hù)的并發(fā)代碼。
正文解析:
一、Rust中的并發(fā)編程基礎(chǔ)
1.1 線程
Rust通過(guò)標(biāo)準(zhǔn)庫(kù)提供了對(duì)線程的支持,使得開(kāi)發(fā)者能夠創(chuàng)建和管理多線程程序。本節(jié)將介紹如何創(chuàng)建線程、線程間的通信和共享數(shù)據(jù)的安全性問(wèn)題。
在Rust中,你可以使用標(biāo)準(zhǔn)庫(kù)提供的?std::thread
?模塊來(lái)創(chuàng)建和管理線程。要?jiǎng)?chuàng)建一個(gè)新線程,你可以使用?std::thread::spawn
?函數(shù),并傳遞一個(gè)閉包作為新線程的入口點(diǎn)。下面是一個(gè)簡(jiǎn)單的例子:
use std::thread;
fn main() {
// 創(chuàng)建一個(gè)新線程
let handle = thread::spawn(|| {
// 在新線程中運(yùn)行的代碼
println!("Hello from the new thread!");
});
// 在主線程中繼續(xù)執(zhí)行其他操作
// 等待新線程結(jié)束
handle.join().expect("Failed to join the thread");
}
在這個(gè)例子中,我們創(chuàng)建了一個(gè)新線程,并在閉包中輸出一條消息。主線程繼續(xù)執(zhí)行其他操作,然后使用?handle.join()
?等待新線程結(jié)束。
線程間的通信可以使用消息傳遞或共享內(nèi)存的方式實(shí)現(xiàn)。Rust提供了多種線程間通信的方式,包括通道(channel)和原子類型等。通過(guò)這些機(jī)制,你可以在多個(gè)線程之間安全地傳遞數(shù)據(jù)。
當(dāng)多個(gè)線程同時(shí)訪問(wèn)和修改共享數(shù)據(jù)時(shí),需要考慮線程安全性的問(wèn)題。Rust通過(guò)所有權(quán)和借用系統(tǒng)來(lái)保證線程安全性。使用互斥鎖(mutex)和原子類型,你可以在多個(gè)線程之間安全地共享數(shù)據(jù)。
1.2 協(xié)程
Rust的協(xié)程由async/await語(yǔ)法支持,通過(guò)異步編程模型實(shí)現(xiàn)輕量級(jí)的并發(fā)。我們將探討Rust中的異步編程模型以及如何編寫(xiě)高效的異步代碼。
Rust的協(xié)程(coroutine)通過(guò)異步編程模型來(lái)實(shí)現(xiàn),并且使用?async/await
?語(yǔ)法進(jìn)行編寫(xiě)。異步編程允許你在單個(gè)線程上同時(shí)執(zhí)行多個(gè)任務(wù),從而實(shí)現(xiàn)輕量級(jí)的并發(fā)。
在Rust中,協(xié)程的主要概念是?Future
?和?async/await
。Future
?是一個(gè)表示異步操作結(jié)果的類型,而?async/await
?則是用于編寫(xiě)異步代碼的語(yǔ)法糖。
下面是一個(gè)簡(jiǎn)單的示例,展示了如何使用?async/await
?來(lái)編寫(xiě)異步函數(shù):
async fn hello() {
println!("Hello from the async function!");
}
#[tokio::main]
async fn main() {
// 調(diào)用異步函數(shù)
hello().await;
println!("Async code execution completed.");
}
在這個(gè)例子中,我們定義了一個(gè)異步函數(shù)?hello
,并在?main
?函數(shù)中使用?await
?關(guān)鍵字來(lái)等待異步函數(shù)執(zhí)行完成。
Rust的異步編程模型主要依賴于第三方庫(kù),如?tokio
?或?async-std
。這些庫(kù)提供了異步運(yùn)行時(shí)和其他異步相關(guān)的工具,使得編寫(xiě)高效的異步代碼變得簡(jiǎn)單。
二、Rust并發(fā)編程的高級(jí)特性
2.1 通道
Rust的標(biāo)準(zhǔn)庫(kù)提供了多種實(shí)現(xiàn)并發(fā)通信的通道類型,如mpsc(多生產(chǎn)者單消費(fèi)者)和spmc(單生產(chǎn)者多消費(fèi)者)。我們將詳細(xì)介紹這些通道的使用方法和適用場(chǎng)景。
在Rust中,標(biāo)準(zhǔn)庫(kù)提供了兩種通道類型:多生產(chǎn)者單消費(fèi)者(MPSC)和單生產(chǎn)者多消費(fèi)者(SPMC)。MPSC通道允許多個(gè)線程作為生產(chǎn)者,但只能有一個(gè)線程作為消費(fèi)者。生產(chǎn)者可以通過(guò)通道發(fā)送消息,而消費(fèi)者可以從通道接收消息。下面是一個(gè)簡(jiǎn)單的示例:
use std::sync::mpsc;
use std::thread;
fn main() {
// 創(chuàng)建一個(gè)MPSC通道
let (sender, receiver) = mpsc::channel();
// 創(chuàng)建多個(gè)生產(chǎn)者線程
for i in 0..5 {
let sender = sender.clone();
thread::spawn(move || {
sender.send(i).expect("Failed to send message");
});
}
// 主線程作為消費(fèi)者接收消息
for _ in 0..5 {
let received = receiver.recv().expect("Failed to receive message");
println!("Received: {}", received);
}
}
在這個(gè)例子中,我們創(chuàng)建了一個(gè)MPSC通道,并使用sender.clone()
克隆了發(fā)送端,每個(gè)生產(chǎn)者線程都持有一個(gè)發(fā)送端的克隆。每個(gè)線程通過(guò)send
方法發(fā)送一個(gè)數(shù)字,主線程作為消費(fèi)者通過(guò)recv
方法接收消息并打印。
SPMC通道允許一個(gè)線程作為生產(chǎn)者,但可以有多個(gè)線程作為消費(fèi)者。生產(chǎn)者可以通過(guò)通道發(fā)送消息,而消費(fèi)者可以同時(shí)從通道接收消息。使用SPMC通道的示例與MPSC通道類似,只需將mpsc::channel()
替換為spmc::channel()
。
通道是一種有效的線程間通信機(jī)制,適用于生產(chǎn)者-消費(fèi)者場(chǎng)景。MPSC通道適用于多個(gè)線程向單個(gè)消費(fèi)者發(fā)送消息的情況,而SPMC通道適用于單個(gè)生產(chǎn)者向多個(gè)消費(fèi)者發(fā)送消息的情況。
2.2 原子操作
Rust的原子操作類型提供了一種線程安全的方式來(lái)進(jìn)行并發(fā)訪問(wèn)和修改共享數(shù)據(jù)。我們將討論原子操作的使用方法和注意事項(xiàng)。
Rust的原子操作類型提供了線程安全的方式來(lái)進(jìn)行并發(fā)訪問(wèn)和修改共享數(shù)據(jù)。原子操作是基于硬件提供的原子指令,可以確保操作的原子性,避免數(shù)據(jù)競(jìng)爭(zhēng)。
標(biāo)準(zhǔn)庫(kù)提供了一些原子操作類型,如AtomicBool
、AtomicI32
、AtomicUsize
等。這些類型具有原子性,可以被多個(gè)線程同時(shí)訪問(wèn)和修改。
下面是一個(gè)使用AtomicUsize
的簡(jiǎn)單示例:
use std::sync::atomic::{AtomicUsize, Ordering};
use std::thread;
fn main() {
// 創(chuàng)建一個(gè)原子計(jì)數(shù)器
let counter = AtomicUsize::new(0);
// 創(chuàng)建多個(gè)線程對(duì)計(jì)數(shù)器進(jìn)行增加操作
let mut handles = vec![];
for _ in 0..5 {
let counter = counter.clone();
let handle = thread::spawn(move || {
counter.fetch_add(1, Ordering::SeqCst);
});
handles.push(handle);
}
// 等待所有線程結(jié)束
for handle in handles {
handle.join().expect("Failed to join thread");
}
// 輸出最終計(jì)數(shù)器的值
println!("Counter: {}", counter.load(Ordering::SeqCst));
}
在這個(gè)例子中,我們創(chuàng)建了一個(gè)AtomicUsize
類型的原子計(jì)數(shù)器,并使用fetch_add
方法在多個(gè)線程中增加計(jì)數(shù)器的值。最后,我們使用load
方法獲取計(jì)數(shù)器的最終值并打印。
使用原子操作類型可以有效地進(jìn)行共享數(shù)據(jù)的并發(fā)訪問(wèn)和修改,避免了數(shù)據(jù)競(jìng)爭(zhēng)和不一致的問(wèn)題。
2.3 鎖
Rust的Mutex和RwLock類型提供了對(duì)共享數(shù)據(jù)的安全訪問(wèn)機(jī)制。我們將介紹如何正確使用鎖來(lái)保證多線程代碼的正確性和性能。
Rust的Mutex和RwLock類型提供了對(duì)共享數(shù)據(jù)的安全訪問(wèn)機(jī)制。Mutex(互斥鎖)允許一次只有一個(gè)線程訪問(wèn)數(shù)據(jù),而RwLock(讀寫(xiě)鎖)允許多個(gè)線程同時(shí)讀取數(shù)據(jù),但只允許一個(gè)線程寫(xiě)入數(shù)據(jù)。
下面是一個(gè)使用Mutex
和RwLock
的簡(jiǎn)單示例:
use std::sync::{Mutex, RwLock};
use std::thread;
fn main() {
// 使用Mutex進(jìn)行共享數(shù)據(jù)的訪問(wèn)
let shared_data = Mutex::new(0);
// 創(chuàng)建多個(gè)線程修改共享數(shù)據(jù)
let mut handles = vec![];
for _ in 0..5 {
let shared_data = shared_data.clone();
let handle = thread::spawn(move || {
let mut data = shared_data.lock().unwrap();
*data += 1;
});
handles.push(handle);
}
// 等待所有線程結(jié)束
for handle in handles {
handle.join().expect("Failed to join thread");
}
// 輸出最終共享數(shù)據(jù)的值
println!("Shared data: {}", *shared_data.lock().unwrap());
// 使用RwLock進(jìn)行共享數(shù)據(jù)的訪問(wèn)
let shared_data = RwLock::new(0);
// 創(chuàng)建多個(gè)線程讀取共享數(shù)據(jù)
let mut handles = vec![];
for _ in 0..5 {
let shared_data = shared_data.clone();
let handle = thread::spawn(move || {
let data = shared_data.read().unwrap();
println!("Shared data: {}", *data);
});
handles.push(handle);
}
// 創(chuàng)建一個(gè)線程寫(xiě)入共享數(shù)據(jù)
let handle = thread::spawn(move || {
let mut data = shared_data.write().unwrap();
*data = 42;
});
handles.push(handle);
// 等待所有線程結(jié)束
for handle in handles {
handle.join().expect("Failed to join thread");
}
}
在這個(gè)例子中,我們首先使用Mutex
創(chuàng)建了一個(gè)共享數(shù)據(jù),并在多個(gè)線程中通過(guò)lock
方法獲取互斥鎖來(lái)修改數(shù)據(jù)。最后,我們使用lock
方法獲取互斥鎖來(lái)輸出最終共享數(shù)據(jù)的值。
然后,我們使用RwLock
創(chuàng)建了另一個(gè)共享數(shù)據(jù),并在多個(gè)線程中通過(guò)read
方法獲取讀取鎖來(lái)并發(fā)讀取數(shù)據(jù)。同時(shí),我們創(chuàng)建了一個(gè)線程使用write
方法獲取寫(xiě)入鎖來(lái)修改數(shù)據(jù)。注意,RwLock
的寫(xiě)入操作是互斥的,因此在寫(xiě)入時(shí)會(huì)阻塞其他線程的讀取。
使用鎖是一種保證多線程代碼正確性和安全性的常見(jiàn)方式。通過(guò)合理地使用Mutex
和RwLock
,你可以確保共享數(shù)據(jù)的訪問(wèn)順序和一致性,避免數(shù)據(jù)競(jìng)爭(zhēng)和不一致的問(wèn)題。
三、實(shí)例展示:優(yōu)化并發(fā)編程性能
通過(guò)實(shí)例展示,將深入探討如何在Rust中優(yōu)化并發(fā)編程性能。具體包括以下內(nèi)容:
1. 并行計(jì)算
將演示如何使用Rust的并發(fā)編程特性來(lái)加速計(jì)算密集型任務(wù),從而充分利用多核處理器的計(jì)算能力。
use std::sync::mpsc;
use std::thread;
fn compute(data: Vec<i32>) -> i32 {
// 這里是計(jì)算密集型任務(wù)的代碼
let result = data.iter().sum();
result
}
fn main() {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let num_threads = 4;
let chunk_size = data.len() / num_threads;
let (sender, receiver) = mpsc::channel();
for i in 0..num_threads {
let chunk = data[i * chunk_size..(i + 1) * chunk_size].to_vec();
let sender = sender.clone();
thread::spawn(move || {
let result = compute(chunk);
sender.send(result).unwrap();
});
}
drop(sender);
let final_result: i32 = receiver.iter().sum();
println!("Final result: {}", final_result);
}
上述代碼通過(guò)將數(shù)據(jù)集劃分為多個(gè)塊,并在不同的線程中計(jì)算每個(gè)塊的部分結(jié)果。最后,通過(guò)通道將部分結(jié)果發(fā)送回主線程,并計(jì)算最終結(jié)果。
2. 異步IO
將展示如何使用Rust的異步編程模型來(lái)優(yōu)化IO密集型任務(wù),提高程序的響應(yīng)速度和吞吐量。
use std::fs::File;
use std::io::{self, BufRead, BufReader};
async fn process_line(line: String) {
// 這里是處理每行數(shù)據(jù)的代碼
println!("Processing line: {}", line);
}
async fn process_file(filename: &str) -> io::Result<()> {
let file = File::open(filename)?;
let reader = BufReader::new(file);
let mut lines = reader.lines();
while let Some(line) = lines.next_line().await? {
process_line(line).await;
}
Ok(())
}
#[tokio::main]
async fn main() -> io::Result<()> {
let filename = "data.txt";
process_file(filename).await?;
Ok(())
}
上述代碼使用異步IO模型處理文件的每一行數(shù)據(jù)。通過(guò)異步方式逐行讀取文件,并在異步任務(wù)中處理每一行的數(shù)據(jù)。這樣可以充分利用IO等待時(shí)間,提高程序的響應(yīng)速度和吞吐量。
3. 數(shù)據(jù)并行
通過(guò)數(shù)據(jù)并行的方式,可以將大數(shù)據(jù)集劃分為多個(gè)任務(wù)并行處理,提高程序的處理效率。我們將介紹如何在Rust中實(shí)現(xiàn)數(shù)據(jù)并行,并討論其優(yōu)缺點(diǎn)。
use rayon::prelude::*;
fn process_data(data: &mut [i32]) {
// 這里是每個(gè)數(shù)據(jù)塊的處理代碼
data.iter_mut().for_each(|x| *x *= 2);
}
fn main() {
let mut data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let chunk_size = 4;
data.par_chunks_mut(chunk_size).for_each(|chunk| {
process_data(chunk);
});
println!("Processed data: {:?}", data);
}
上述代碼使用Rayon庫(kù)實(shí)現(xiàn)數(shù)據(jù)的并行處理。通過(guò)將數(shù)據(jù)集劃分為多個(gè)塊,并使用par_chunks_mut
方法并行地處理每個(gè)塊的數(shù)據(jù),從而提高程序的處理效率。
四、并發(fā)編程的挑戰(zhàn)與最佳實(shí)踐
并發(fā)編程不僅帶來(lái)了性能提升,也引入了一些挑戰(zhàn)和難點(diǎn)。本節(jié)將討論在Rust中進(jìn)行并發(fā)編程時(shí)可能遇到的問(wèn)題,并提供一些最佳實(shí)踐和解決方案。主要包括以下內(nèi)容:
-
共享數(shù)據(jù)的安全性:在并發(fā)編程中,多個(gè)線程同時(shí)訪問(wèn)和修改共享數(shù)據(jù)可能導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)和并發(fā)安全問(wèn)題。為了確保共享數(shù)據(jù)的安全性,可以使用互斥鎖(Mutex)或讀寫(xiě)鎖(RwLock)來(lái)保護(hù)共享數(shù)據(jù)的訪問(wèn)。通過(guò)正確使用鎖機(jī)制,可以避免多個(gè)線程同時(shí)修改數(shù)據(jù),保證數(shù)據(jù)的一致性和正確性。
-
死鎖和饑餓:死鎖是指多個(gè)線程因?yàn)榛ハ嗟却龑?duì)方釋放資源而無(wú)法繼續(xù)執(zhí)行的情況。饑餓是指某個(gè)線程由于其他線程的資源占用導(dǎo)致無(wú)法獲得所需資源而無(wú)法執(zhí)行的情況。為了避免死鎖和饑餓,需要合理設(shè)計(jì)鎖的獲取和釋放順序,并避免線程之間出現(xiàn)循環(huán)依賴的資源獲取關(guān)系。此外,可以使用超時(shí)機(jī)制或者避免使用過(guò)多的鎖來(lái)提高程序的吞吐量和響應(yīng)性能。
-
調(diào)度器優(yōu)化:Rust的調(diào)度器對(duì)并發(fā)程序的性能起著重要作用。調(diào)度器決定了線程如何分配和利用系統(tǒng)資源。為了優(yōu)化調(diào)度器的性能,可以考慮以下幾點(diǎn):合理設(shè)置線程的數(shù)量,避免創(chuàng)建過(guò)多的線程導(dǎo)致資源爭(zhēng)用;使用線程池來(lái)重用線程,減少線程創(chuàng)建和銷毀的開(kāi)銷;合理設(shè)置任務(wù)的調(diào)度策略,根據(jù)任務(wù)的特點(diǎn)選擇合適的并發(fā)度和調(diào)度算法;使用異步編程模型來(lái)提高程序的并發(fā)性能,減少線程的上下文切換開(kāi)銷。
-
錯(cuò)誤處理和線程間通信:并發(fā)編程中的錯(cuò)誤處理和線程間通信也是需要考慮的重要方面。在處理錯(cuò)誤時(shí),可以使用Result和Option等類型來(lái)傳遞和處理錯(cuò)誤信息。在線程間通信時(shí),可以使用通道(Channel)或消息傳遞機(jī)制來(lái)實(shí)現(xiàn)線程之間的數(shù)據(jù)交換和同步。合理處理錯(cuò)誤和進(jìn)行有效的線程間通信可以提高程序的可靠性和性能。
-
測(cè)試和調(diào)試:并發(fā)程序的測(cè)試和調(diào)試是挑戰(zhàn)性的任務(wù)。為了確保并發(fā)程序的正確性,可以使用各種測(cè)試工具和技術(shù),如單元測(cè)試、集成測(cè)試、模擬器等。此外,可以使用調(diào)試工具來(lái)分析并發(fā)程序的執(zhí)行過(guò)程,定位問(wèn)題和性能瓶頸。
結(jié)論:
Rust提供了豐富的并發(fā)編程原語(yǔ)和工具,使得開(kāi)發(fā)者能夠輕松編寫(xiě)高效的并發(fā)代碼。通過(guò)正確地使用Rust的并發(fā)編程特性,我們能夠提升程序的性能和響應(yīng)速度,并充分利用計(jì)算資源。然而,并發(fā)編程也帶來(lái)了一些挑戰(zhàn),需要開(kāi)發(fā)者謹(jǐn)慎處理共享數(shù)據(jù)的安全性和避免常見(jiàn)的并發(fā)問(wèn)題。通過(guò)學(xué)習(xí)并實(shí)踐本文介紹的并發(fā)編程概念和最佳實(shí)踐,我們可以在Rust中編寫(xiě)出高效、安全且易于維護(hù)的并發(fā)代碼。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-858640.html
參考文獻(xiàn):
[1] Rust Documentation: Concurrency -?Fearless Concurrency - The Rust Programming Language
[2] The Rustonomicon: Fearless Concurrency -?Introduction - The Rustonomicon
[3] "Concurrency in Rust" by Aaron Turon -?Aaron Turon's tech blog · Aaron Turon文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-858640.html
到了這里,關(guān)于Rust并發(fā)編程實(shí)踐:10分鐘入門系統(tǒng)級(jí)編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!