为什么无法在Mutex包裹的VecDeque上调用VecDeque::push_back方法?
错误原因
Mutex<T>是互斥访问的包裹容器,本身不直接透传内部T的方法,必须先调用lock()获取锁,得到内部数据的访问权限后才能操作VecDeque。你直接对Mutex实例调用push_back,自然会报方法不存在的错误。
修复方法
不需要将VecDeque放到结构体中即可正常使用,正确操作逻辑如下:
- 调用
Mutex的lock()方法获取锁,拿到MutexGuard对象,该对象可直接调用VecDeque的方法。 - 如果后续需要在多个并发任务间共享这个队列,需要给
Mutex外层套一层Arc实现多所有权共享。
修复后测试代码
use std::collections::VecDeque; use std::sync::Mutex; use reqwest::Client; #[tokio::main] async fn main() -> Result<(), ()> { let client = Client::new(); let tank = Mutex::new(VecDeque::new()); // 这里unwrap仅作测试使用,生产环境请自行处理锁被污染的错误 let mut tank_guard = tank.lock().unwrap(); tank_guard.push_back(2); tank_guard.push_back(3); println!("{:?}", tank_guard); // 手动释放锁,其他任务即可获取锁访问队列 drop(tank_guard); Ok(()) }
注意事项
如果需要跨.await点持有锁,不要使用std::sync::Mutex,否则会阻塞异步runtime工作线程引发性能问题,该场景建议替换为tokio::sync::Mutex。
内容的提问来源于stack exchange,提问作者pekasus
相关产品推荐
相关产品推荐

