首页 > 解决方案 > 是否有类似于 Java 中的 Reentrant Lock for Swift 的库?

问题描述

我目前正在研究一个可以被多个线程使用的函数。问题是该函数需要先完成并将结果存储在缓存中。同时,其他线程可能正在调用此函数,我需要它们等待完成。我们能够在 Java 上使用 Reentrant Lock 实现这一点,在 swift 中有类似的库吗?我看到 NSRecursiveLock 接近了我们正在尝试做的事情,但是,我们只想快速保持它。我也看到了多篇文章,例如这篇关于使用 GCD 的文章,但是,我相信这是类似但不同的东西:https ://medium.com/@prasanna.aithal/multi-threading-in-ios-使用-swift-82f3601f171c

先感谢您。

标签: swiftswift5

解决方案


带锁的递归总是有点痛点。一个干净的解决方案是将需要锁的函数重构为获取锁的外部 API,然后转发到不需要锁的内部 API。内部不调用外部 API。

一个简单的例子可能是这样的(这几乎是 Swift 代码 -parameters需要填写实际工作实现)

extension DispatchSemaphore
{
    func withLock<R>(_ block: () throws -> R) rethrows -> R
    {
        wait()
        defer { signal() }
        return try block()
    }
}

let myLock = DispatchSemaphore(value: 1)

func recursiveLockingFunction(parameters)
{
    func nonLockingFunc(parameters) {
        if /* some terminating case goes here */ {
             // Do the terminating case
             return
        }

        // Do whatever you need to do to handle the partial problem and 
        // and reduce the parameters
        nonLockingFunc(reducedParameters)
    }

    myLock.withLock { nonLockingFunc(parameters) }
}

这是否适合您取决于您​​的设计,但如果唯一的问题是您要锁定的函数是递归的,则应该可以工作。它只使用 GCD( DispatchSemaphore) 来实现它。


推荐阅读