Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 - Fatal编程技术网

在Objective-C中,如何检测多个线程是否正在访问该方法?

在Objective-C中,如何检测多个线程是否正在访问该方法?,objective-c,multithreading,Objective C,Multithreading,在Objective-C中,我们知道@synchronized可以用来定义一个关键部分,但是有没有办法知道多个线程是否正在访问一个方法或代码块?您可以使用NSLock对象()并使用tryLock测试锁: @interface MyObject : NSObject { NSLock *_lock; } ... @end @implementation MyObject - (id)init { ... _lock = [[NSLock alloc] init];

在Objective-C中,我们知道@synchronized可以用来定义一个关键部分,但是有没有办法知道多个线程是否正在访问一个方法或代码块?

您可以使用
NSLock
对象()并使用
tryLock
测试锁:

@interface MyObject : NSObject
{
    NSLock *_lock;
}
...

@end

@implementation MyObject

- (id)init
{
    ...
    _lock = [[NSLock alloc] init];
    ...
}

- (BOOL)myMethod
{
    if (![_lock tryLock])
    {
        NSLog(@"Failed to acquire lock");
        return NO;
    }

    // Thread has exclusive access
    // Caution; the lock won't be automatically unlocked if this method throws an exception
    // so add some exception handling here to ensure it's always unlocked...
    @try
    {
        // Do stuff
    }
    @finally
    {
        [_lock unlock];
    }
    return YES;
}

@end

您可以使用
NSLock
对象()并使用
tryLock
测试锁:

@interface MyObject : NSObject
{
    NSLock *_lock;
}
...

@end

@implementation MyObject

- (id)init
{
    ...
    _lock = [[NSLock alloc] init];
    ...
}

- (BOOL)myMethod
{
    if (![_lock tryLock])
    {
        NSLog(@"Failed to acquire lock");
        return NO;
    }

    // Thread has exclusive access
    // Caution; the lock won't be automatically unlocked if this method throws an exception
    // so add some exception handling here to ensure it's always unlocked...
    @try
    {
        // Do stuff
    }
    @finally
    {
        [_lock unlock];
    }
    return YES;
}

@end

这是为了调试吗?您可以检查[NSThread currentThread]实例(如果需要,您还有[NSThread mainThread]实例…)是用于调试。这是为了在开发过程中进行检查,以确保我没有添加不必要的@synchronized块。这是为了调试吗?您可以检查[NSThread currentThread]实例(如果需要的话,您还有[NSThread mainThread]实例…)是为了调试。这是为了在开发过程中检查以确保我没有添加不必要的@synchronized块。谢谢。对于@synchronized,我应该使用什么支票?@Boon没有
@synchronized
将生成
pthread\u mutex
代码,该代码将始终尝试锁定,并且除了使用类似于我的答案的方法之外,没有其他方法来执行try lock,这就是我相信您正在寻找的。谢谢。对于@synchronized,我应该使用什么支票?@Boon没有
@synchronized
将生成
pthread\u mutex
代码,该代码将始终尝试锁定,并且除了使用类似于我的答案的方法之外,没有其他方法来执行try lock,我相信您正在寻找它。