- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我所知,我应该始终选择 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/
我是一名优秀的程序员,十分优秀!