rust 异步上下文中的原子数据

ttygqcqt  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(112)

有没有办法在异步上下文中使用原子类型,而不是异步MutexRwLock
标准原子可以在异步上下文中原样使用吗?
或者,举例来说,是否存在一个异步的等效std::sync::atomic::AtomicUsizeload/store方法,它可以用read().await/write().await方法替换类似tokio::sync::RwLock<usize>的东西?

idfiyjo8

idfiyjo81#

是的,在异步上下文中使用Atomics没有问题。
大部分都是免锁的。
即使您要阻塞,仍然建议使用普通的阻塞同步原语,而不是异步同步原语,除非您在await期间持有该锁。
有关更多信息,我引用respective chapter of the tokio tutorial

使用std::sync::Mutex

注意,std::sync::Mutexnottokio::sync::Mutex用于保护HashMap。一个常见的错误是无条件地从异步代码中使用tokio::sync::Mutex。异步互斥锁是一个在调用.await时被锁定的互斥锁。
同步互斥锁会在等待获取锁时阻塞当前线程,这反过来又会阻塞其他任务的处理。然而,切换到tokio::sync::Mutex通常没有帮助,因为异步互斥锁在内部使用同步互斥锁。
根据经验,只要争用保持较低,并且在调用.await时不持有锁,就可以在异步代码中使用同步互斥锁。此外,考虑使用parking_lot::Mutex作为std::sync::Mutex的更快替代方案。
注意,这当然只有在所有访问所述锁/原子的线程都是异步工作线程时才成立,如果您有可能阻塞互斥锁的外部线程,您必须考虑等待互斥锁阻塞操作,并将其视为阻塞操作。

相关问题