【发布时间】:2021-09-30 23:13:51
【问题描述】:
我了解 Dart 是单线程的,并且在隔离中,函数调用会从事件循环队列中弹出并执行。好像有两种情况,异步和同步。
a) 异步:异步函数将不间断地运行,直到它到达 await 关键字。此时,它可以释放对指令指针的控制或继续其例程。 (即异步函数可以但不需要在等待时被中断)
b) 同步:来自 setup -> body -> 和 teardown 的所有指令都将不间断地执行。如果是这种情况,我会说同步函数是原子的。
我有一个事件监听器,它可能在事件循环队列中有多个调用。我想我有两个选择。
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