You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么无法在Mutex包裹的VecDeque上调用VecDeque::push_back方法?

错误原因

Mutex<T>是互斥访问的包裹容器,本身不直接透传内部T的方法,必须先调用lock()获取锁,得到内部数据的访问权限后才能操作VecDeque。你直接对Mutex实例调用push_back,自然会报方法不存在的错误。

修复方法

不需要将VecDeque放到结构体中即可正常使用,正确操作逻辑如下:

  1. 调用Mutex的lock()方法获取锁,拿到MutexGuard对象,该对象可直接调用VecDeque的方法。
  2. 如果后续需要在多个并发任务间共享这个队列,需要给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:18:07