当多个 Future/Timer 同时完成时是否存在竞争条件
Is there race condition when multiple Future/Timer complete simultaneously
如果多个 Timer/Future 在 Dart 中同时完成,是否会出现竞争条件?例如,在以下代码中访问 Timer complete handler 中的 test
和 test
结构时是否存在竞争条件?
import 'dart:async';
void main() {
Map<String, int> test = {};
List<int> test2 = [];
Timer t1 = Timer(Duration(seconds: 1), () {
test['a'] = 45;
test2.add(1);
});
Timer t2 = Timer(Duration(seconds: 1), () {
test['b'] = 67;
test2.add(2);
});
Timer t3 = Timer(Duration(seconds: 2), () {
print(test);
print(test2);
});
}
或者 Timer/Future 完成由主线程同步处理?两个回调里面的代码可以交织吗?
每个 Dart isolate 在单个线程中执行代码。异步代码 运行ning 在单个 Dart isolate 中可以 运行 concurrently 但不能 parallel.
一般来说,如果回调本身做的是异步工作,那么它们是可以交错的。任何 await
(相当于任何 Future.then()
回调)是执行 returns 事件循环的点,中断您的异步函数。
在您的特定示例中,您的回调是完全同步的,不能被中断。您的 Timer
s 可能会按定义的顺序触发,因为事件已添加到 FIFO 队列中。然而,这似乎很脆弱,我认为依赖回调排序不是一个好主意。
另见:.
如果多个 Timer/Future 在 Dart 中同时完成,是否会出现竞争条件?例如,在以下代码中访问 Timer complete handler 中的 test
和 test
结构时是否存在竞争条件?
import 'dart:async';
void main() {
Map<String, int> test = {};
List<int> test2 = [];
Timer t1 = Timer(Duration(seconds: 1), () {
test['a'] = 45;
test2.add(1);
});
Timer t2 = Timer(Duration(seconds: 1), () {
test['b'] = 67;
test2.add(2);
});
Timer t3 = Timer(Duration(seconds: 2), () {
print(test);
print(test2);
});
}
或者 Timer/Future 完成由主线程同步处理?两个回调里面的代码可以交织吗?
每个 Dart isolate 在单个线程中执行代码。异步代码 运行ning 在单个 Dart isolate 中可以 运行 concurrently 但不能 parallel.
一般来说,如果回调本身做的是异步工作,那么它们是可以交错的。任何 await
(相当于任何 Future.then()
回调)是执行 returns 事件循环的点,中断您的异步函数。
在您的特定示例中,您的回调是完全同步的,不能被中断。您的 Timer
s 可能会按定义的顺序触发,因为事件已添加到 FIFO 队列中。然而,这似乎很脆弱,我认为依赖回调排序不是一个好主意。
另见: