【问题标题】:Is it safe to access objects with different indexes in NSMutableArray from separate threads?从单独的线程访问 NSMutableArray 中具有不同索引的对象是否安全?
【发布时间】:2020-08-03 02:51:21
【问题描述】:

我有一个带有一些对象的 NSMutableArray,我知道 NSMutableArray 不是线程安全的类。我想知道是否可以从不同的线程访问该数组中的每个对象,如下所示:

for (int i = 0; i < muArr.count; i++) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        muArr[i] = [[NSObject alloc] init];
    });
}

【问题讨论】:

    标签: ios objective-c cocoa-touch thread-safety


    【解决方案1】:

    您的代码 sn-p 没有访问数组中的每个对象 (muArr),它是 设置 它。 “非线程安全”的定义排除了有保证的安全写访问......

    当您使用 dispatch 时,您可以做的是创建对可变数组的受控访问,类似于:

    • 创建与数组一起使用的并发调度队列
    • 可以将写操作作为异步屏障操作分派到此队列
    • 读操作是同步操作
    • 如果愿意,您可以将其全部封装在 NSMutableArray 的子类中,只需遵循文档中给出的子类化要求即可。

    如果您在设计和实现这样的事情时遇到困难,请提出一个新问题(在首先检查 SO 和其他来源之后)显示您的代码并解释您的问题,毫无疑问有人会帮助您。

    HTH

    【讨论】:

    • 感谢您的回复。对不起,我上面的表达不是很清楚。那 sn-p 是我想要做的,只是设置来自不同线程的对象并且没有访问权限。我想知道这是否会导致崩溃等问题。
    • @P.Tsin - 语句muArr[i] = [[NSObject alloc] init]; 创建一个新对象,然后将对该对象的引用分配给可变数组中的索引。您正在对并发队列使用多个异步调度来对数组中的每个现有索引执行此操作。这正是您不能安全地做的事情,因为NSMutableArray 不是线程安全的。 HTH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    相关资源
    最近更新 更多