【问题标题】:Can I use atomics in an asynchronous context?异步上下文中的原子数据
【发布时间】:2022-12-04 20:36:19
【问题描述】:

有没有办法在异步上下文中使用原子类型而不是异步 MutexRwLock

可以在异步上下文中按原样使用标准原子吗?

或者,例如,是否存在 std::sync::atomic::AtomicUsizeload / store 方法的异步等价物,它可以用 read().await / write().await 方法替换 tokio::sync::RwLock<usize> 之类的方法?

【问题讨论】:

  • 为什么 loadstore 是异步的?他们立即行动。
  • 是的,Atomics 非常适合异步使用。通常,您甚至不应该使用异步 MutexRwLocks,除非您必须在等待点上持有锁。
  • 谢谢,这就是我一直在寻找的答案!

标签: asynchronous rust mutex atomic rwlock


【解决方案1】:

是的,在异步上下文中使用 Atomics 是没有问题的。

它们中的大多数是无锁的(=甚至不能阻塞)。

即使你会阻塞,仍然建议使用普通的阻塞同步原语而不是异步原语,除非你在 await 期间持有该锁。

有关更多信息,我引用 respective chapter of the tokio tutorial

在使用std::sync::Mutex

注意,std::sync::Mutex不是tokio::sync::Mutex用来保护HashMap。一个常见的错误是在异步代码中无条件地使用 tokio::sync::Mutex。异步互斥锁是在对.await 的调用中被锁定的互斥锁。

同步互斥锁在等待获取锁时会阻塞当前线程。反过来,这将阻止其他任务的处理。但是,切换到 tokio::sync::Mutex 通常没有帮助,因为异步互斥锁在内部使用同步互斥锁。

根据经验,只要竞争保持低水平并且在对 .await 的调用中不持有锁,在异步代码中使用同步互斥体就可以了。此外,考虑使用parking_lot::Mutex 作为std::sync::Mutex 的更快替代方案。

【讨论】:

    猜你喜欢
    • 2015-08-16
    • 2018-04-14
    • 1970-01-01
    • 2017-06-05
    • 2018-06-30
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多