gpt4 book ai didi

ios - 使用 NSRecursiveLock 从方法返回值

转载 作者:行者123 更新时间:2023-11-29 03:16:00 25 4
gpt4 key购买 nike

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

考虑这段代码,其中 myItemsArray 是一个 NSMutableArray:

- (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;
}

但是,我认为这种方法会破坏线程安全,因为另一个线程可以添加或删除项目after -unlock 被调用,但是before itemCount 被返回。

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

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

最佳答案

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

关于ios - 使用 NSRecursiveLock 从方法返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21705754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com