Objective c @已同步-跳过而不是等待
我有一个Objective-c应用程序,有几个代码块,我只希望一个线程一次能够访问它。使用@synchronized(self)块就可以了 但是,我有一个块,如果另一个线程在@synchronized块中,我希望它跳过该块,而不是等待。有没有一种方法可以简单地测试self(或者我的锁对象是什么)是否被另一个同步块持有Objective c @已同步-跳过而不是等待,objective-c,multithreading,mutex,Objective C,Multithreading,Mutex,我有一个Objective-c应用程序,有几个代码块,我只希望一个线程一次能够访问它。使用@synchronized(self)块就可以了 但是,我有一个块,如果另一个线程在@synchronized块中,我希望它跳过该块,而不是等待。有没有一种方法可以简单地测试self(或者我的锁对象是什么)是否被另一个同步块持有 // block 1 - wait until lock is available @synchronized(self) { ... } ... // block 2 -
// block 1 - wait until lock is available
@synchronized(self) {
...
}
...
// block 2 - wait until lock is available
@synchronized(self) {
...
}
...
// block 3 - wait until lock is available
@synchronized(self) {
...
}
...
// block 4 - skip if lock is not immediately available - no waiting!
howDoISkipIfLockIsNotAvailable(self) {
...
}
如果使用
NSLock
或NSRecursiveLock
而不是@synchronized
语法,则可以实现所需的功能。它提供的关键功能是tryLock
方法:
NSRecursiveLock *lock = [[NSRecursiveLock alloc] init];
[lock lock];
@try {
// ... do synchronized stuff
}
@finally {
[lock unlock];
}
if ([lock tryLock]) {
@try {
// do synchronized stuff if possible
}
@finally {
[lock unlock];
}
}
我希望能找到与synchronized()配合使用的东西,但我想不会。。。但是,在上面的示例中,使用NSRecursiveLock而不是NSLock可能更适合synchronized()的行为,因为synchronized()也可以递归工作。@synchronized只是转换为低级API
pthread\u mutex\u(un)lock
,当然还有pthread\u mutex\u trylok
。因此,从理论上讲,您可以混合使用高级语法sugar和低级API来实现try case。但在实践中,您无法获得对@synchronized使用的同一互斥对象的引用,至少我不知道如何。。。