【问题标题】:Is there race condition when multiple Future/Timer complete simultaneously多个 Future/Timer 同时完成时是否存在竞争条件
【发布时间】:2020-09-09 03:14:24
【问题描述】:

如果多个 Timer/Future 在 Dart 中同时完成,会出现竞态条件吗?例如,以下代码中的 Timer 完成处理程序中访问 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);
  });
}

或者主线程同步处理定时器/未来完成?两个回调中的代码可以交织吗?

【问题讨论】:

    标签: dart race-condition


    【解决方案1】:

    每个 Dart 隔离在单个线程中执行代码。在单个 Dart 隔离中运行的异步代码可以同时运行,但不能并行。

    一般来说,如果回调本身做异步工作,那么它们可以交错。任何await(相当于任何Future.then() 回调)都是执行返回事件循环的点,从而中断您的异步函数。

    在您的特定示例中,您的回调是完全同步的,不能被中断。您的Timers 可能会按定义的顺序触发,因为事件已添加到 FIFO 队列中。但是,这似乎很脆弱,我认为依赖回调排序不是一个好主意。

    另见:Prevent concurrent access to the same data in Dart。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-11
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2019-11-30
      相关资源
      最近更新 更多