01.Mutex基本概念
a.定义
Mutex提供互斥访问,同一时刻只允许一个线程持有锁。
b.代码示例
---
use std::sync::Mutex;
fn main() {
let m = Mutex::new(5);
{
let mut num = m.lock().unwrap();
*num = 6;
}
println!("{:?}", m);
}
---
02.跨线程使用
a.Arc<Mutex<T>>
使用Arc包装Mutex实现跨线程共享。
b.代码示例
---
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Result: {}", *counter.lock().unwrap());
}
---
1.3 读写锁:RwLock
01.RwLock基本概念
a.定义
RwLock允许多个读者或一个写者,提高读多写少场景的并发性。
b.代码示例
---
use std::sync::RwLock;
fn main() {
let lock = RwLock::new(5);
{
let r1 = lock.read().unwrap();
let r2 = lock.read().unwrap();
println!("{} {}", *r1, *r2);
}
{
let mut w = lock.write().unwrap();
*w += 1;
}
}
---
02.读写分离
a.功能说明
多个线程可以同时持有读锁,但写锁是独占的。
b.代码示例
---
use std::sync::{Arc, RwLock};
use std::thread;
fn main() {
let data = Arc::new(RwLock::new(vec![1, 2, 3]));
let mut handles = vec![];
for i in 0..5 {
let data = Arc::clone(&data);
let handle = thread::spawn(move || {
let v = data.read().unwrap();
println!("Reader {}: {:?}", i, *v);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
---
1.4 条件变量:Condvar
01.Condvar概念
a.定义
条件变量用于线程间的通知机制,配合Mutex使用。
b.代码示例
---
use std::sync::{Arc, Mutex, Condvar};
use std::thread;
fn main() {
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = Arc::clone(&pair);
thread::spawn(move || {
let (lock, cvar) = &*pair2;
let mut started = lock.lock().unwrap();
*started = true;
cvar.notify_one();
});
let (lock, cvar) = &*pair;
let mut started = lock.lock().unwrap();
while !*started {
started = cvar.wait(started).unwrap();
}
}
---
1.5 原子操作:Atomic
01.原子类型
a.定义
原子类型提供无锁的线程安全操作。
b.代码示例
---
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
use std::thread;
fn main() {
let counter = Arc::new(AtomicUsize::new(0));
let mut handles = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
counter.fetch_add(1, Ordering::SeqCst);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Result: {}", counter.load(Ordering::SeqCst));
}
---
01.死锁概念
a.定义
多个线程互相等待对方释放锁,导致程序永久阻塞。
b.预防方法
按固定顺序获取锁。
使用try_lock避免阻塞。
使用超时机制。
02.代码示例
a.死锁示例
---
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let lock1 = Arc::new(Mutex::new(0));
let lock2 = Arc::new(Mutex::new(0));
let l1 = Arc::clone(&lock1);
let l2 = Arc::clone(&lock2);
thread::spawn(move || {
let _g1 = l1.lock().unwrap();
let _g2 = l2.lock().unwrap();
});
let _g2 = lock2.lock().unwrap();
let _g1 = lock1.lock().unwrap();
}
---
2 Mutex详解
2.1 基本用法
01.创建Mutex
a.功能说明
使用Mutex::new()创建互斥锁。
b.代码示例
---
use std::sync::Mutex;
fn main() {
let m = Mutex::new(5);
let mut num = m.lock().unwrap();
*num = 6;
println!("{}", *num);
}
---
2.2 lock与try_lock
01.lock方法
a.功能说明
阻塞等待直到获取锁。
b.代码示例
---
use std::sync::Mutex;
fn main() {
let m = Mutex::new(0);
let guard = m.lock().unwrap();
println!("{}", *guard);
}
---
02.try_lock方法
a.功能说明
尝试获取锁,立即返回。
b.代码示例
---
use std::sync::Mutex;
fn main() {
let m = Mutex::new(0);
match m.try_lock() {
Ok(guard) => println!("Got lock: {}", *guard),
Err(_) => println!("Could not get lock"),
}
}
---
2.3 MutexGuard与RAII
01.MutexGuard
a.定义
MutexGuard是lock()返回的守卫,离开作用域时自动释放锁。
b.代码示例
---
use std::sync::Mutex;
fn main() {
let m = Mutex::new(5);
{
let mut guard = m.lock().unwrap();
*guard += 1;
} // guard在此处自动释放
println!("{:?}", m);
}
---
2.4 跨线程共享:Arc-Mutex
01.Arc包装
a.功能说明
使用Arc实现Mutex的跨线程共享。
b.代码示例
---
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&data);
let handle = thread::spawn(move || {
let mut num = data.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Result: {}", *data.lock().unwrap());
}
---
01.Barrier概念
a.定义
屏障用于同步多个线程,等待所有线程到达屏障点。
b.代码示例
---
use std::sync::{Arc, Barrier};
use std::thread;
fn main() {
let barrier = Arc::new(Barrier::new(3));
let mut handles = vec![];
for i in 0..3 {
let b = Arc::clone(&barrier);
let handle = thread::spawn(move || {
println!("Thread {} before barrier", i);
b.wait();
println!("Thread {} after barrier", i);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
---
01.信号量
a.定义
控制同时访问资源的线程数量。
b.使用tokio::sync::Semaphore
---
use tokio::sync::Semaphore;
use std::sync::Arc;
#[tokio::main]
async fn main() {
let semaphore = Arc::new(Semaphore::new(3));
let mut handles = vec![];
for i in 0..10 {
let permit = semaphore.clone();
let handle = tokio::spawn(async move {
let _guard = permit.acquire().await.unwrap();
println!("Task {} acquired", i);
});
handles.push(handle);
}
for handle in handles {
handle.await.unwrap();
}
}
---
5.4 Channel作为同步工具
01.Channel同步
a.功能说明
使用channel进行线程间通信和同步。
b.代码示例
---
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
tx.send(42).unwrap();
});
let received = rx.recv().unwrap();
println!("Received: {}", received);
}
---
5.5 parking_lot库
01.parking_lot特点
a.性能更好
比标准库的锁性能更高。
b.功能更丰富
提供公平锁、超时等功能。
c.代码示例
---
use parking_lot::Mutex;
fn main() {
let m = Mutex::new(5);
let mut guard = m.lock();
*guard = 6;
}
---
5.6 crossbeam同步工具
01.crossbeam库
a.功能
提供高性能的并发工具。
b.代码示例
---
use crossbeam::channel;
use std::thread;
fn main() {
let (s, r) = channel::unbounded();
thread::spawn(move || {
s.send(42).unwrap();
});
println!("{}", r.recv().unwrap());
}
---