1

variable にいくつかのオブジェクトを含む可変配列があるとしますarray

私がしているスレッドから言ってみましょうA

NSArray *arrayCopy = [array copy];

そしてスレッドからB

[array addObject:NSNull.null];

安全ですか?具体的には、このコードarrayは、コピー中に変更される可能性があるためにクラッシュする可能性がありますか?

4

2 に答える 2

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 に答える