Objective c 有没有办法检查是否获得了NSLock?
我正在研究多线程代码。数据访问通过“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
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块中,那么您应该能够指望锁的状态不会改变。