我正在使用多線程代碼。數據訪問通過「NSLock」對象鎖定在幾個部分中。我想確保在這些部分中調用的某些方法檢查是否獲得了合適的鎖定。有沒有辦法檢查是否獲得了NSLock?
喜歡的東西:
assert([myLock isSet] == YES);
我找不到像在NSLock 「isSet」。任何想法如何確保鎖定?
謝謝!
我正在使用多線程代碼。數據訪問通過「NSLock」對象鎖定在幾個部分中。我想確保在這些部分中調用的某些方法檢查是否獲得了合適的鎖定。有沒有辦法檢查是否獲得了NSLock?
喜歡的東西:
assert([myLock isSet] == YES);
我找不到像在NSLock 「isSet」。任何想法如何確保鎖定?
謝謝!
你是如何獲得鎖?如果你打電話給lock
,那麼事實上,你甚至在之後運行應該保證你已經獲得它。如果您致電lockBeforeDate
,則返回值會告訴您。
如果你想從其他地方進行測試,你可以做
if ([myLock tryLock])
{
// oops, lock was not previously acquired!
...
[myLock unlock];
}
else
{
// yep, lock was already acquired
}
然而,一般來說這似乎是一個值得商榷的事情要做。你應該在需要的地方進行鎖定,並相信它能夠工作,而不是試圖從外部監督它。
號
因爲,你看,不管結果你得到的是無用的,因爲它可能會(will)是錯誤的,你避開真正使用它的時間。例如:
它失敗的另一種方式,也:
像這樣的問題正是爲什麼調試死鎖和競爭條件是如此棘手的棘手。
我想你應該問你關於你的實際問題的另一個問題。
大體上是這樣,但有一個角落的情況。如果鎖獲取和測試發生在@synchronized塊中,那麼你應該能夠指望鎖的狀態不變。 – 2015-04-16 21:20:59
謝謝。 tryLock正是我想要的。 我可以這樣做:assert(![myLock tryLock]); 我明白,這告訴我,該對象是「鎖定」。它並不告訴我正確的線程是否有鎖。此外,我同意你的看法,這是一個值得懷疑的事情。但我拼命試圖找到一個錯誤(我不認爲這個錯誤是鎖定相關的,但我在其他代碼中找不到任何錯誤 - 所以我必須檢查鎖定)。 – 2010-08-24 13:23:10
Lars Schneider:'tryLock'完全按照它的說法:它試圖鎖定鎖。如果成功,這並不意味着它之前沒有鎖定,這也意味着它現在被鎖定*。這就是爲什麼你需要解鎖它,如果成功的話:否則,當你不想要的時候你會鎖定。 – 2010-08-24 14:21:28
+1在提問前回答問題。 – 2014-06-07 06:17:12