gpt4 book ai didi

rust - 在哪些情况下 Arc> 不是 Rust 中跨线程共享数据的最佳方式?

转载 作者:行者123 更新时间:2023-11-29 08:04:38 26 4
gpt4 key购买 nike

据我所知,我应该始终选择 Arc<T>用于跨线程共享读取访问和 Arc<Mutex<T>>用于跨线程共享写访问。在某些情况下我不想使用 Arc<T>/Arc<Mutex<T>>而是做一些完全不同的事情?例如。做这样的事情:

unsafe impl Sync for MyStruct {}
unsafe impl Send for MyStruct {}

let shared_data_for_writing = Arc::from(MyStruct::new());

最佳答案

跨线程共享

此外Arc<T> ,我们可以使用作用域线程跨线程共享对象,例如通过使用 crossbeam::scope Scope::spawn .作用域线程允许我们将借用的指针 (&'a T) 发送到作用域中生成的线程。范围保证线程将在引用对象被删除之前终止。与 Arc<T> 相比,借用的指针没有运行时开销(Arc<T> 占用更多内存,需要使用原子指令维护引用计数器)。

跨线程改变

Mutex<T>是最基本的通用包装器,用于确保最多一个线程可以在任何给定时间改变一个值。 Mutex<T>有一个缺点:如果有许多线程只想读取互斥锁中的值,它们就不能同时这样做,即使这样做是安全的。 RwLock<T> 通过允许多个并发读取器(同时仍确保写入器具有独占访问权限)来解决此问题。

原子类型,例如 AtomicUsize 还允许跨线程突变,但仅限于小值(8、16、32 或 64 位——一些处理器支持对 128 位值的原子操作,但标准库中尚未公开;参见 atomic::Atomic 了解)。例如,而不是 Arc<Mutex<usize>> , 你可以使用 Arc<AtomicUsize> .原子类型不需要锁定,但它们是通过原子机器指令进行操作的。原子指令集与非原子指令集有点不同,因此从非原子类型切换到原子类型可能并不总是“直接替换”。

关于rust - 在哪些情况下 Arc<Mutex<T>> 不是 Rust 中跨线程共享数据的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57682358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com