2010-08-24 73 views
3

我正在使用多线程代码。数据访问通过“NSLock”对象锁定在几个部分中。我想确保在这些部分中调用的某些方法检查是否获得了合适的锁定。有没有办法检查是否获得了NSLock?

喜欢的东西:

assert([myLock isSet] == YES); 

我找不到像在NSLock “isSet”。任何想法如何确保锁定?

谢谢!

回答

9

你是如何获得锁?如果你打电话给lock,那么事实上,你甚至在之后运行应该保证你已经获得它。如果您致电lockBeforeDate,则返回值会告诉您。

如果你想从其他地方进行测试,你可以做

if ([myLock tryLock]) 
{ 
    // oops, lock was not previously acquired! 
    ... 
    [myLock unlock]; 
} 
else 
{ 
    // yep, lock was already acquired 
} 

然而,一般来说这似乎是一个值得商榷的事情要做。你应该在需要的地方进行锁定,并相信它能够工作,而不是试图从外部监督它。

+0

谢谢。 tryLock正是我想要的。 我可以这样做:assert(![myLock tryLock]); 我明白,这告诉我,该对象是“锁定”。它并不告诉我正确的线程是否有锁。此外,我同意你的看法,这是一个值得怀疑的事情。但我拼命试图找到一个错误(我不认为这个错误是锁定相关的,但我在其他代码中找不到任何错误 - 所以我必须检查锁定)。 – 2010-08-24 13:23:10

+4

Lars Schneider:'tryLock'完全按照它的说法:它试图锁定锁。如果成功,这并不意味着它之前没有锁定,这也意味着它现在被锁定*。这就是为什么你需要解锁它,如果成功的话:否则,当你不想要的时候你会锁定。 – 2010-08-24 14:21:28

+1

+1在提问前回答问题。 – 2014-06-07 06:17:12

5

因为,你看,不管结果你得到的是无用的,因为它可能会(will)是错误的,你避开真正使用它的时间。例如:

  1. 您发现锁已锁定。
  2. 持有锁的线程将其解锁。
  3. 您报告锁已锁定。

它失败的另一种方式,也:

  1. 您发现该锁没有锁上。
  2. 另一个线程锁定了锁。
  3. 您报告锁已解锁。

像这样的问题正是为什么调试死锁和竞争条件是如此棘手的棘手。

我想你应该问你关于你的实际问题的另一个问题。

+1

大体上是这样,但有一个角落的情况。如果锁获取和测试发生在@synchronized块中,那么你应该能够指望锁的状态不变。 – 2015-04-16 21:20:59

相关问题