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

Lar*_*der 3 cocoa multithreading posix locking objective-c

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

就像是:

assert([myLock isSet] == YES);
Run Code Online (Sandbox Code Playgroud)

我在NSLock中找不到像"isSet"这样的东西.是否设置了如何确保锁定的任何想法?

谢谢!

wal*_*lky 11

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

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

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

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

  • Lars Schneider:`tryLock`正是它所说的:它试图锁定锁.如果成功,那不仅仅意味着它之前没有锁定,它还意味着它现在被锁定*.这就是为什么你需要解锁它,如果它成功:否则,你可能不想要锁定. (5认同)
  • +1用于在提问之前回答问题。 (2认同)

Pet*_*sey 7

没有.

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

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

它也失败了:

  1. 您发现锁未锁定.
  2. 另一个线程锁定锁.
  3. 您报告锁已解锁.

像这样的问题正是为什么调试死锁和竞争条件非常棘手的原因.

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