Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c @已同步-跳过而不是等待_Objective C_Multithreading_Mutex - Fatal编程技术网

Objective c @已同步-跳过而不是等待

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 -

我有一个Objective-c应用程序,有几个代码块,我只希望一个线程一次能够访问它。使用@synchronized(self)块就可以了

但是,我有一个块,如果另一个线程在@synchronized块中,我希望它跳过该块,而不是等待。有没有一种方法可以简单地测试self(或者我的锁对象是什么)是否被另一个同步块持有

// 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使用的同一互斥对象的引用,至少我不知道如何。。。