簡體   English   中英

鎖已經存在時執行NSLock.lock()?

[英]NSLock.lock() executed while lock already held?

我正在審查一些Alamofire 示例 Retrier代碼:

   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() ,然后在傳遞給refreshTokens的閉包中使用相同的行strongSelf.lock.lock()

如果在執行defer解鎖時,直到should方法結束時才釋放第一個鎖,那么第二個strongSelf.lock.lock()在第一個鎖被保持時如何成功執行?

refreshTokens的尾隨閉包,其中第二次調用lock() / unlock()被調用,異步運行。 這是因為閉包是@escaping並且是在refreshTokens例程中的responseJSON內調用的。 因此, refreshTokens實際調用refreshTokens的關閉時, should方法將執行其延遲unlock

話雖如此,這不是我見過的最優雅的代碼,其中鎖的效用不明確,死鎖的風險依賴於其他例程的實現細節。 它看起來好像在這里,但我不會責怪你挑眉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM