gpt4 book ai didi

ios - 为各种函数创建一个数组线程安全 - iOS

转载 作者:行者123 更新时间:2023-11-29 02:37:48 53 4
gpt4 key购买 nike

我有一个 NSMutableArray *testArray,它被多个线程访问并用于 4 个不同的函数。假设 A 类从函数“addValue:”内的线程 13(后台线程)更新此 testArray,B 类从函数“checkIndex:”内的线程 1(主线程)更新 testArray。

在“addValue:”函数中,我正在更新 testArray 的内容,然后是 B 类,它使用“checkIndex”检查 testArray 中的对象索引。 A 类更新 testArray,B 类从 testArray 的旧副本中获取索引。在哪里使 testArray 线程安全?

对于测试数组

 Class A -> addValue:   (BackgroundThread)
Class B -> checkIndex: (Main Thread)

最佳答案

数组不是线程安全的。

我想你可以创建一个线程安全的 NSArray 的自定义子类(实际上是 NSMutableArray),但是 NSArray 是类簇的一部分,并且对类簇进行子类化很棘手,而且你可能会降低性能,因为系统使用各种内部子类根据您的用例优化性能,而您的子类可能不具备这些智能。

您可以做的是创建线程安全的包装函数。创建一个包含数组的类,并提升与 NSMutableArray 相同的访问器方法。

让该子类在对数组的每次读取或写入调用周围断言一个锁。

在这种情况下,自旋锁可能是一个不错的选择,因为读取和冲突次数可能相当小,并且读写操作的速度应该很快。 (自旋锁不需要内核调用,并导致调用线程阻塞,直到另一个线程的锁被释放。没有内核调用意味着它在非冲突情况下非常快,因为读写调用很快,即使是碰撞情况也没有那么糟糕。)

在 Xcode 文档中搜索“线程编程指南”,了解有关您可以使用的不同类型的锁及其优缺点的更多信息。

关于ios - 为各种函数创建一个数组线程安全 - iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26153388/

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