gpt4 book ai didi

swift - NSLock.lock() 在锁定已持有时执行?

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:21 26 4
gpt4 key购买 nike

我正在审查一些 Alamofire sample重试代码:

   func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
lock.lock() ; defer { lock.unlock() }

if let response = request.task.response as? HTTPURLResponse, response.statusCode == 401 {
requestsToRetry.append(completion)

if !isRefreshing {
refreshTokens { [weak self] succeeded, accessToken, refreshToken in
guard let strongSelf = self else { return }

strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() }

...
}
}
} else {
completion(false, 0.0)
}
}

我不理解如何在函数的第一行有 lock.lock() 然后在同一行 strongSelf.lock.lock() 在传递给 refreshTokens 的闭包中。

如果在执行 defer 解锁时,直到 should 方法结束时第一个锁才被释放,那么第二个 strongSelf.lock 是如何释放的。 lock() 在持有第一个锁时成功执行?

最佳答案

refreshTokens 的尾随闭包异步运行,第二次调用 lock()/unlock() 时调用。这是因为闭包是 @escaping 并且是从 refreshTokens 例程内的 responseJSON 中调用的。因此,在实际调用 refreshTokens 的闭包时,should 方法将执行其延迟的 unlock

话虽如此,这并不是我见过的最优雅的代码,其中锁的实用性不明确,死锁的风险如此依赖于其他例程的实现细节。看起来这里还可以,但我不怪你对此挑眉。

关于swift - NSLock.lock() 在锁定已持有时执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40064929/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com