Java for Swift 是否有类似于 Reentrant Lock 的库?
is there a library similar to Reentrant Lock in Java for Swift?
我目前正在研究一个可以被多个线程使用的函数。问题是函数需要先完成并将结果存储在缓存中。与此同时,其他线程可能正在调用这个函数,我需要它们等待直到完成。我们能够在 Java 上使用 Reentrant Lock 完成此操作 swift 中是否有类似的库?我看到 NSRecursiveLock 接近我们正在尝试做的事情,但是,我们只想将其保留为 swift。我也看过多篇文章,比如这篇关于使用 GCD 的文章,但是,我相信这是针对类似但不同的内容:https://medium.com/@prasanna.aithal/multi-threading-in-ios-using-swift-82f3601f171c
提前致谢。
带锁的递归总是有点痛。一个干净的解决方案是将需要锁定的函数重构为获取锁定的外部 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
)来实现。
我目前正在研究一个可以被多个线程使用的函数。问题是函数需要先完成并将结果存储在缓存中。与此同时,其他线程可能正在调用这个函数,我需要它们等待直到完成。我们能够在 Java 上使用 Reentrant Lock 完成此操作 swift 中是否有类似的库?我看到 NSRecursiveLock 接近我们正在尝试做的事情,但是,我们只想将其保留为 swift。我也看过多篇文章,比如这篇关于使用 GCD 的文章,但是,我相信这是针对类似但不同的内容:https://medium.com/@prasanna.aithal/multi-threading-in-ios-using-swift-82f3601f171c
提前致谢。
带锁的递归总是有点痛。一个干净的解决方案是将需要锁定的函数重构为获取锁定的外部 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
)来实现。