使用NSRecursiveLock从方法返回值

时间:2014-02-11 15:16:32

标签: ios objective-c multithreading macos synchronization

我正在将一些线程安全代码从@synchronized转换为NSRecursiveLock

请考虑myItemsArrayNSMutableArray

的代码
- (NSUInteger) numberOfItems {
    @synchronized(self.myItemsArray) {
        return self.myItemsArray.count;
    }
}

我认为以下代码不正确,因为锁永远不会解锁:

- (NSUInteger) numberOfItems {
    [self.myRecursiveLock lock];
    return self.myItemsArray.count;
    [self.myRecursiveLock unlock];
}

所以我正在使用这种方法:

- (NSUInteger) numberOfItems {
    [self.myRecursiveLock lock];
    NSUInteger itemCount = self.myItemsArray.count;
    [self.myRecursiveLock unlock];

    return itemCount;
}

但是,我认为这种方法会破坏线程的安全性,因为另一个线程可以在调用 -unlock之后添加或删除项目,但之前 {返回{1}}。

我不确定我是否认为最后一种方法不是线程安全的,因为我在许多广泛使用的第三方库中看到了这种模式(例如,[AFHTTPRequestOperation -responseObject]

从使用itemCount同步的方法返回值的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

保护numberOfItems永远无法确保计数是最新的。方法返回后,阵列可能会被另一个线程修改。它只能防止两个线程同时调用count方法。