【问题标题】:Are synchronous functions in Dart executed atomically?Dart 中的同步函数是原子执行的吗?
【发布时间】:2021-09-30 23:13:51
【问题描述】:

我了解 Dart 是单线程的,并且在隔离中,函数调用会从事件循环队列中弹出并执行。好像有两种情况,异步和同步。

a) 异步:异步函数将不间断地运行,直到它到达 await 关键字。此时,它可以释放对指令指针的控制或继续其例程。 (即异步函数可以但不需要在等待时被中断)

b) 同步:来自 setup -> body -> 和 teardown 的所有指令都将不间断地执行。如果是这种情况,我会说同步函数是原子的。

我有一个事件监听器,它可能在事件循环队列中有多个调用。我想我有两个选择。

使用the Synchronized package

a) 异步版本:

import 'package:synchronized/synchronized.dart';

final Lock _lock = Lock();

...

() async {
    await _lock.synchronized(() async {
      if (_condition) {
        _signal.complete(status);
        _condition = !_condition;
      }
    });
}

b) 同步版本:

() {
    if (_condition) {
      _signal.complete(status);
      _condition = !_condition;
    }
}

根据我对 Dart 并发模型的理解,这些是等价的。我更喜欢 b) 因为它很简单。但是,这要求在对我的同步事件处理程序的两次调用之间不能存在竞争条件。我在 GIL 和 MT 语言中使用了并发,但没有使用事件循环范例。

【问题讨论】:

    标签: dart concurrency


    【解决方案1】:

    a) 异步:异步函数将不间断地运行,直到它到达 await 关键字。此时,它可以释放对指令指针的控制或继续其例程。 (即异步函数可以但不需要在等待时被中断)

    await 总是 让步。相当于设置了一个Future.then()回调,返回Dart事件循环。

    对于您的简单示例,没有理由使用_lock.synchronized()。同步代码不能被中断,并且隔离(顾名思义)不共享内​​存。如果您的回调执行异步工作并且您需要防止并发异步操作被交错,您需要某种形式的锁定机制。

    【讨论】:

    • 谢谢,这正是我需要知道的。当我在异步中有异步但需要防止竞争条件时,我会使用锁。
    猜你喜欢
    • 2021-12-07
    • 2015-05-26
    • 2016-06-10
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多