2013-11-01 2 views
1

Предположим, у меня есть изменяемый массив, содержащий некоторые объекты в переменной array.Является ли копирование NSMutableArray потокобезопасным?

Скажем, из ниток A я:

NSArray *arrayCopy = [array copy]; 

и из ниток B:

[array addObject:NSNull.null]; 

ли это безопасно? В частности, может ли этот код сбой из-за потенциальной модификации array во время копирования?

ответ

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). Если кто-то предоставит ссылку, я буду признателен.

Смежные вопросы