gpt4 book ai didi

rust - 在Rust中使用单个增变器进行无锁数据共享

转载 作者:行者123 更新时间:2023-12-03 11:36:00 24 4
gpt4 key购买 nike

上下文

作为练习,我试图在Rust中重新实现https://github.com/urbanairship/sarlacc-pit

Sarlacc-pit将外部源镜像到内存中的数据结构(Set/Map/Etc)。图书馆的客户纯粹是根据馆藏开展 Activity ,却不知道其内容在幕后发生变化。

问题

客户端需要保留对集合的不变引用,而单个更新线程保留可变的引用以更新其内容。这直接违反了 rust 的保证,但在这种情况下应具有以下粗略结构,这是安全的:

pub struct Map<K, V> {
delegate: SomeReferenceType<Arc<HashMap<K, V>>>
}

impl<K, V> Map<K, V> {
pub fn get(&self, k: &K) -> Option<&V> {
self.delegate.borrow().get(k)
}

fn update(&mut self, new_delegate: HashMap<K, V>) {
self.delegate.set(Arc::new(new_delegate));
}
}

pub struct UpdateService<K, V> {
collection: Arc<Map<K, V>>
}

impl<K, V> UpdateService<K ,V> {
pub fn get_collection(&self) -> Arc<Map<K, V>> {
collection.clone()
}

// Called from a thread run on a cadence
fn update_collection(&mut self) {
let new_value = /* fetch and process value from backing store */
self.collection.borrow_mut().update(new_value);
}
}

我意识到,由于多种原因,它无法编译。

问题的核心是:SomeReferenceType的类型应该是什么,以允许这些可变和不可变的引用在没有ReadWriteLock之类的条件下共存?我想念什么吗?

最佳答案

如果从另一个线程调用update_collection,您如何保证主线程不在同一时间从集合读取数据?使用您提供的信息,您需要像RwLockMutex这样的代码来确保此安全。

您已经断言您认为这是安全的。如果您的系统上存在一个未公开的约束条件,可让您保证不会发生同时进行的读写操作,则可能有一种方法可以将其合并到类型中。但是,否则无法给出更好的答案。

例如,如果不经常进行更新,则可以满足您的用例,以使用集合的三个副本,并在每次修改后交换它们:

  • 可供阅读的一种,
  • 一个写作,
  • 一种用于在交换集合
  • 时转换客户端

    但是,这不是“初学者”级别的Rust项目。

    关于rust - 在Rust中使用单个增变器进行无锁数据共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59483183/

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