swift - 是否有类似于 Java 中的 Reentrant Lock for Swift 的库?
问题描述
我目前正在研究一个可以被多个线程使用的函数。问题是该函数需要先完成并将结果存储在缓存中。同时,其他线程可能正在调用此函数,我需要它们等待完成。我们能够在 Java 上使用 Reentrant Lock 实现这一点,在 swift 中有类似的库吗?我看到 NSRecursiveLock 接近了我们正在尝试做的事情,但是,我们只想快速保持它。我也看到了多篇文章,例如这篇关于使用 GCD 的文章,但是,我相信这是类似但不同的东西:https ://medium.com/@prasanna.aithal/multi-threading-in-ios-使用-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
) 来实现它。
推荐阅读
- flutter - Navigator Pushnamed not found route inside listview.builder in flutter
- css - Fas fa 竖起大拇指消失
- excel - 邮件合并日期交换月份和日期
- java - 如何使用 android studio 发送认证邮件
- xamarin - 如何更改 tabbedPage 上“更多”选项卡的名称
- angular - 如何在 Angular 中实现 360° Producti 查看器
- c# - MassTransit 如何在我发布或使用消息时创建自定义中间件或管道
- angularjs - Validation with Asp.Net Web Forms + Angularjs Tabs如何解决?
- php - 将对象数组更改为多维数组并打印
- c# - 尝试在另一个场景中统一调整比例设置后,移动速度变慢