有没有办法在异步上下文中使用原子类型来代替异步Mutex或RwLock?标准原子可以在异步上下文中使用吗?或者,例如,是否有一个异步等效的std::sync::atomic::AtomicUsize与load/store方法,它可以用read().await/write().await方法替换类似tokio::sync::RwLock<usize>的内容?
Mutex
RwLock
std::sync::atomic::AtomicUsize
load
store
read().await
write().await
tokio::sync::RwLock<usize>
bvhaajcl1#
是的,在异步上下文中使用Atomics没有问题。大部分都是免锁的。即使您要阻塞,仍然建议使用普通的阻塞同步原语,而不是异步同步原语,除非您在await期间持有该锁。有关更多信息,我引用respective chapter of the tokio tutorial:
await
使用std::sync::Mutex时
std::sync::Mutex
注意,std::sync::Mutex和nottokio::sync::Mutex用于保护HashMap。一个常见的错误是无条件地从异步代码中使用tokio::sync::Mutex。异步互斥锁是一个在调用.await时被锁定的互斥锁。同步互斥锁会在等待获取锁时阻塞当前线程,这反过来又会阻塞其他任务的处理。然而,切换到tokio::sync::Mutex通常没有帮助,因为异步互斥锁在内部使用同步互斥锁。根据经验,只要争用保持较低,并且在调用.await时不持有锁,就可以在异步代码中使用同步互斥锁。此外,考虑使用parking_lot::Mutex作为std::sync::Mutex的更快替代方案。注意,这当然只有在所有访问所述锁/原子的线程都是异步工作线程时才成立,如果您有可能阻塞互斥锁的外部线程,您必须考虑等待互斥锁阻塞操作,并将其视为阻塞操作。
tokio::sync::Mutex
HashMap
.await
parking_lot::Mutex
1条答案
按热度按时间bvhaajcl1#
是的,在异步上下文中使用Atomics没有问题。
大部分都是免锁的。
即使您要阻塞,仍然建议使用普通的阻塞同步原语,而不是异步同步原语,除非您在
await
期间持有该锁。有关更多信息,我引用respective chapter of the tokio tutorial:
使用
std::sync::Mutex
时注意,
std::sync::Mutex
和nottokio::sync::Mutex
用于保护HashMap
。一个常见的错误是无条件地从异步代码中使用tokio::sync::Mutex
。异步互斥锁是一个在调用.await
时被锁定的互斥锁。同步互斥锁会在等待获取锁时阻塞当前线程,这反过来又会阻塞其他任务的处理。然而,切换到
tokio::sync::Mutex
通常没有帮助,因为异步互斥锁在内部使用同步互斥锁。根据经验,只要争用保持较低,并且在调用
.await
时不持有锁,就可以在异步代码中使用同步互斥锁。此外,考虑使用parking_lot::Mutex
作为std::sync::Mutex
的更快替代方案。注意,这当然只有在所有访问所述锁/原子的线程都是异步工作线程时才成立,如果您有可能阻塞互斥锁的外部线程,您必须考虑等待互斥锁阻塞操作,并将其视为阻塞操作。