有没有办法检查是否获得了NSLock?

时间:2010-08-24 12:33:02

标签: objective-c multithreading cocoa locking posix

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

类似的东西:

assert([myLock isSet] == YES);

我在NSLock中找不到类似“isSet”的内容。是否设置了如何确保锁定的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:9)

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

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

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

然而,总的来说这似乎是一个值得怀疑的事情。你应该在需要的地方进行锁定并相信它可以工作,而不是试图从外面监督它。

答案 1 :(得分:6)

没有

因为,你知道,无论你得到什么结果都是无用的,因为当你实际使用它时,它可能会(will)出错。一个例子:

  1. 您发现锁被锁定。
  2. 持有锁的线程将其解锁。
  3. 您报告锁被锁定。
  4. 它也失败了:

    1. 您发现锁未锁定。
    2. 另一个线程锁定锁。
    3. 您报告锁已解锁。
    4. 这样的问题正是为什么调试死锁和竞争条件非常棘手的原因。

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