【问题标题】:Should the state in BLoC pattern be thread-safe?BLoC 模式中的状态应该是线程安全的吗?
【发布时间】:2021-04-22 01:39:01
【问题描述】:

我是 BLoC 设计模式的新手,对此我有一个问题: state 是否需要(绿色)线程安全?

我在下面给出一个简短的伪代码:

class Bloc {
  State state;
  
  StreamSubscription subscription;
  
  void subscribe(Stream src) {
    this.subscription = src.listen(this.businessLogic);
  }
  
  async void businessLogic(Object data) {
    State oldState = this.state;
    State newState = await someAsyncFunction(oldState); // <-- here
    this.state = newState;
  }
}

在这种情况下,如果两个数据连续到达src,我猜可能会发生竞争条件: 如果第二个数据到达而第一个数据正在等待someAsyncFunction,则oldState 将是businessLogic 第一次和第二次调用的初始状态。

对这个问题有什么好的见解吗?谢谢!

【问题讨论】:

    标签: flutter dart bloc


    【解决方案1】:

    Dart 默认只在 1 个线程上运行,因此 dart 中没有线程的概念。等价的术语是隔离和事件循环,它管理在单独的线程上运行代码的隔离。因此,要回答您的问题“否”,如果您不使用 Isolates BLOC,则不需要线程安全。

    如果您使用的是 Future 那么它也将使用相同的事件循环并让您的 Future 函数等待响应从该 Future 函数的执行到达,所以如果您想等到响应到达然后分配另一个值到 newState 那么你需要按照以下方式使用 Async await。

     Future<void> businessLogic(Object data) async{
        State oldState = this.state;
        State newState = await someAsyncFunction(oldState); // <-- here
        this.state = newState;
     }
    

    更多关于隔离和事件循环的信息here

    【讨论】:

    • 感谢您的帮助。我知道 Dart 默认使用单线程模型,但问题仍然存在(实际上我将其称为“绿色线程安全”),其中 this.state 被读取 -> 读取 -> 更新 -> 更新 -ed,而不是读取 -> 更新 - > 阅读 -> 更新。你给的代码能解决这个问题吗?
    • @YukiHashimoto 不,它没有,但它是关于 dart 中的线程如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多