以线程安全的方式运行组合链

问题描述

我有一个使用Operation子类和OperationQueue实现的现有流程。我正在尝试将合并作为学习练习重新实现。

简化后的当前版本如下:

func testFunction(completionHandler: (Result) -> Void) {
    let op = LongRunningOperation(object: self.stateObject)

    op.completionHandler = { [unowned op] in
        let result = op.result
        self.stateObject.update(with: result)

        completionHandler(result)
    }

    localSerialQueue.addOperation(op)
}

一些重要方面。 LongRunningOperation是异步的。根据{{​​1}},可能需要调出主队列以完成登录过程。仅在stateObject上访问stateObject。另外,为了明确起见,还可能有对localSerialQueue的其他并发调用,因此由队列+操作提供的序列化是必不可少的。

可变状态潜在的并发调用的组合对于该问题绝对至关重要。

为了说明这个问题,我制作了一个示例,证明,该合并管道不是原子执行的。任何其他结果都会令我感到惊讶,但我只是想验证一下。多个线程可以同时执行管道的各个阶段,这违反了我们的前提条件检查。

runOperation

非常清楚,我的问题不是关于如何建立一个合并管道。它涉及Combine同步原语的语义,以及如何保护管道中访问的可变状态。而且,可能的解决方案是将Combine与另一种形式的同步(如锁)结合使用来处理这种访问模式。没关系!我只是好奇是否其他人遇到了这种问题,是否有更惯用的方式,或者我是否可以以某种方式重新构造问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)