variable にいくつかのオブジェクトを含む可変配列があるとしますarray
。
私がしているスレッドから言ってみましょうA
:
NSArray *arrayCopy = [array copy];
そしてスレッドからB
:
[array addObject:NSNull.null];
安全ですか?具体的には、このコードarray
は、コピー中に変更される可能性があるためにクラッシュする可能性がありますか?
variable にいくつかのオブジェクトを含む可変配列があるとしますarray
。
私がしているスレッドから言ってみましょうA
:
NSArray *arrayCopy = [array copy];
そしてスレッドからB
:
[array addObject:NSNull.null];
安全ですか?具体的には、このコードarray
は、コピー中に変更される可能性があるためにクラッシュする可能性がありますか?
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ではコピー関数がスレッドセーフです)。誰かがリンクを提供してくれれば、私は感謝します。