我必须在循环中的每个迭代开始时生成一个很大的Vec<Mutex<...>>,它在循环中发生Mutations .因为每次迭代重新生成它是相当昂贵的,我正在寻找一些方法来初始化vec一次,并使deep个克隆的矢量在循环中使用.当然,简单的.clone()是行不通的,因为克隆人仍然会以互斥方式保护内存中的相同数据,而不是复制它.一些类似的事情

let my_vec = (0..big_usize).map(|_| Mutex::new(..)).collect();

for ... {
    clone = my_vec.deep_clone();
    mutate_clone_safely();
}

推荐答案

正如kmdreko在 comments 中指出的,您正在寻找的deep_clone可以像这样实现:

fn deep_clone<T: Clone>(v: &[Mutex<T>]) -> Vec<Mutex<T>> {
    v.iter()
        .map(|el| Mutex::new(el.lock().unwrap().clone()))
        .collect()
}

提供了字面上的答案,我仍然摆脱不了XY问题的感觉.人们可能会合理地问,不被任何人共享的互斥锁有什么意义(因为它们是为本地使用而创建的).更多的信息可能会带来一个明显更好的解决方案.

Rust相关问答推荐

在Rust中创建可变片段的可变片段的最有效方法是什么?

如何从接收&;self的方法克隆RC

通过使用光标拖动角来绕其中心旋转矩形

当T不执行Copy时,如何返回Arc Mutex T后面的值?

不能在一个代码分支中具有不变的自身borrow ,而在另一个代码分支中具有可变的self borrow

我是否可以在Ruust中修改 struct 实例上的字符串,以使其在修改后具有相同的字符串生存期?

正在将带有盒的异步特征迁移到新的异步_fn_in_特征功能

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

为什么 vec![Vec::with_capacity(n)] 为子向量创建 0 容量?

提取指向特征函数的原始指针

一次不能多次borrow *obj作为可变对象

面临意外的未对齐指针取消引用:地址必须是 0x8 的倍数,但为 0x__错误

Rust 为什么被视为borrow ?

简单 TCP 服务器的连接由对等重置错误,mio 负载较小

为什么 i32 Box 类型可以在 Rust 中向下转换?

仅在运行测试时生成调试输出

如何使用 rust bindgen 生成的 std_vector

如何为枚举中的单个或多个值返回迭代器

为什么我不能为 Display+Debug 的泛型类型实现 std::error::Error 但有一个不是泛型参数的类型?

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?