我正在使用多线程代码。数据访问通过“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