1

假设我有一个可变数组,其中包含变量中的一些对象array

A让我们从我做的线程说:

NSArray *arrayCopy = [array copy];

并从线程B

[array addObject:NSNull.null];

安全吗?array具体来说,这段代码是否会因为复制时的潜在修改而崩溃?

4

2 回答 2

4

不 ,突变 anNSMutableArray不是线程安全操作

于 2013-11-01T22:14:05.433 回答
1

Apple 表示 NSMutableArray 不是线程安全的。但是,如果您在一个线程中添加对象并在另一个线程中复制,它不会崩溃。如果你从不同的线程添加对象,它会崩溃。

import Foundation
import XCPlayground

var array = NSMutableArray()
var queues = [NSOperationQueue]()

let syncQueue = NSOperationQueue()
syncQueue.maxConcurrentOperationCount = 1

for i in 0..<100 {
    let queue = NSOperationQueue()
    queue.maxConcurrentOperationCount = 1
    queues.append(queue)

    queue.addOperationWithBlock({
        for j in 0..<100000 {
            if j == 0 {
                sleep(1)
            } else {
                usleep(j < 5 ? 100 : rand() % 10 == 0 ? 1 : 0)
            }

            if i % 2 == 0 {
                syncQueue.addOperationWithBlock({
                    array.addObject(NSNumber(int: rand()))
                })
            } else {
                var copy = array.copy()
            }
        }
    })
}

XCPSetExecutionShouldContinueIndefinitely()

但是,我没有找到将对其进行描述的文档(该复制函数在 NSMutableArray 上是线程安全的)。如果有人提供链接,我将不胜感激。

于 2015-11-24T13:08:48.000 回答