rust 我可以在异步上下文中使用原子吗?

mm9b1k5b  于 2023-01-09  发布在  其他
关注(0)|答案(1)|浏览(168)

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

bvhaajcl

bvhaajcl1#

是的,在异步上下文中使用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的更快替代方案。
注意,这当然只有在所有访问所述锁/原子的线程都是异步工作线程时才成立,如果您有可能阻塞互斥锁的外部线程,您必须考虑等待互斥锁阻塞操作,并将其视为阻塞操作。

相关问题