在Rust中,Mutex
(互斥鎖)用于確保在同一時間只有一個線程可以訪問共享資源。Mutex
提供了兩種主要的鎖粒度:
粗粒度鎖:在這種粒度下,整個數據結構被鎖定,這意味著在執行任何操作時,整個數據結構都無法被其他線程訪問。這種鎖粒度可能會導致性能問題,因為即使只有一個線程需要訪問數據結構的一部分,其他線程也必須等待。
細粒度鎖:在這種粒度下,只有需要訪問的數據結構的特定部分被鎖定。這可以提高性能,因為多個線程可以同時訪問數據結構的不同部分,而不會相互阻塞。要實現細粒度鎖,可以使用RwLock
(讀寫鎖),它允許多個讀取者同時訪問數據結構,但只允許一個寫入者。
要在Rust中使用Mutex
和RwLock
,首先需要在Cargo.toml
文件中添加依賴:
[dependencies]
std = { version = "1.0", features = ["full"] }
然后,在代碼中引入所需的類型:
use std::sync::{Arc, Mutex, RwLock};
use std::thread;
下面是一個使用Mutex
的示例,展示了如何在多個線程之間共享數據:
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handlers = vec![];
for i in 0..10 {
let counter = Arc::clone(&counter);
let handler = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handlers.push(handler);
}
for handler in handlers {
handler.join().unwrap();
}
println!("Result: {}", *counter.lock().unwrap());
}
在這個例子中,我們使用Arc
(原子引用計數)來共享Mutex
,以便在多個線程之間安全地傳遞所有權。Mutex
確保在同一時間只有一個線程可以訪問counter
變量。
如果你需要實現細粒度鎖,可以使用RwLock
。下面是一個使用RwLock
的示例:
use std::sync::{Arc, RwLock};
use std::thread;
fn main() {
let data = Arc::new(RwLock::new(vec![1, 2, 3]));
let mut handlers = vec![];
for i in 0..3 {
let data = Arc::clone(&data);
let handler = thread::spawn(move || {
let mut data = data.write().unwrap();
data[i] += 1;
});
handlers.push(handler);
}
for handler in handlers {
handler.join().unwrap();
}
println!("Result: {:?}", *data.read().unwrap());
}
在這個例子中,我們使用RwLock
來允許多個讀取者同時訪問data
向量,但只允許一個寫入者。這可以提高性能,因為多個線程可以同時讀取數據,而不會相互阻塞。