3

Мне интересно, как я могу сделать доступ к квалифицированному WP-потоку __block в контексте метода.Objective-C __block ключевое слово и безопасность потоков

Пример:

__block NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 

for (int i=0; i<20; i++) { 
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
     [dictionary setObject:@"test" forKey:@"test"]; 
    }]; 
    [someConcurrentQueue addOperation:operation]; 
} 

Здесь операция добавляется к параллельной очереди и dictionary вар будет потенциально доступ из разных потоков одновременно.

Безопасно ли это? Если нет, как я могу сделать доступ к dictionary безопасным?

+6

Я надеваю «Не верьте, что' __block' необходим здесь, потому что вы не меняете то, что означает «словарь», а только внутренние свойства объекта. Я не уверен в вашей проблеме параллелизма, за исключением очевидного решения просто использовать очередную очередь или обертывать небезопасную операцию в другом блоке, который отправляется в одну последовательную очередь. – UIAdam

ответ

5

Как сказал UIAdam в своем комментарии, __block ничего не делает для вас здесь; вы мутируете словарь, а не присваиваете переменной. Переменная будет продолжать указывать на тот же словарь навсегда.

Фактически, __block может нанести вам ущерб, так как это означает, что переменная не будет захвачена блоком. Если вы не используете ARC, это означает, что словарь не будет сохранен, и блок может вскоре отправлять сообщения мертвому объекту. Я не уверен, что изменит это ARC. Во всяком случае, вы должны оставить __block этой переменной; если ничего другого, код более четко выражает ваши намерения без него.

Что касается вашего фактического вопроса, касающегося безопасности потоков, этот код не является безопасным. According to the Thread-Safety Summary, изменяемые классы коллекции не являются потокобезопасными: вы должны отправлять сообщения в изменяемую коллекцию из не более чем одного потока за раз. Синхронизация будет одним из способов; setting the queue's max concurrent operation count - 1 будет другим.

+3

В режиме ARC сохраняется словарь '_will_. Подробнее об этом: http://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.html (см. Раздел «Блоки») – ivanzoid

4

это не нить безопасна, но не имеет никакого отношения к ключевому слову __block, потому что вы только читаете, но не пишете.

самый простой способ, чтобы сделать его поточно использует @synchronized ключевое слово

__block NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 

for (int i=0; i<20; i++) { 
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ 
     @synchronized(dictionary) { 
      [dictionary setObject:@"test" forKey:@"test"]; 
     } 
    }]; 
    [someConcurrentQueue addOperation:operation]; 
} 

или вы можете использовать NSLock или любые типы блокировки

должен прочитать для получения дополнительной информации https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html

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

  • Нет связанных вопросов^_^