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

Objective c 有没有办法检查是否获得了NSLock?,objective-c,multithreading,cocoa,locking,posix,Objective C,Multithreading,Cocoa,Locking,Posix,我正在研究多线程代码。数据访问通过“NSLock”对象在多个部分中锁定。我想确保在这些部分中调用的一些方法检查是否获得了相应的锁 比如: assert([myLock isSet] == YES); 我在NSLock中找不到类似“isSet”的东西。有没有办法确保锁被设置好 谢谢 您是如何获得锁的?如果您正在调用lock,那么即使在之后运行,也应该保证您已经获得了它。如果调用lockBeforeDate,返回值会告诉您 如果您想从其他地方进行测试,您可以这样做 if ( [myLock try

我正在研究多线程代码。数据访问通过“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
}
然而,总的来说,这似乎是一件值得怀疑的事情。你应该在需要的地方锁定它,并相信它能工作,而不是试图从外部监督它。

因为,你看,你得到的任何结果都是无用的,因为当你开始实际使用它时,它可能()是错误的。例如:

  • 你发现锁上了
  • 固定锁的螺纹将其解锁
  • 您报告锁已锁定
  • 它在另一方面也失败了:

  • 你发现锁没有锁上
  • 另一条线锁住了锁
  • 您报告锁已解锁
  • 这类问题正是调试死锁和竞争条件如此棘手的原因


    我想你应该就你的实际问题再问一个问题。

    谢谢。特罗克正是我想要的。我可以做:断言(![myLock tryLock]);我明白,这告诉我该对象已“锁定”。它不会告诉我正确的线程是否有锁。此外,我同意你的看法,这是一件值得怀疑的事情。但是我正在拼命地寻找一个bug(我认为这个bug与锁定无关,但我在其他代码中也找不到任何错误-因此我必须检查锁定)。Lars Schneider:
    tryLock
    完全按照它说的做:它试图锁定锁。如果它成功了,这不仅意味着它以前没有被锁定,还意味着它现在被锁定。这就是为什么如果它成功了,你需要解锁它:否则,你可能不想打开锁。在提问之前回答问题+1。基本上是正确的,但有一个极端情况。如果锁的获取和测试发生在@synchronized块中,那么您应该能够指望锁的状态不会改变。