В Objective-C у вас есть различие между атомарными и неатомарными свойствами:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
Насколько я понимаю, вы можете безопасно читать и записывать свойства, определенные как атомарные, из нескольких потоков, в то время как одновременная запись и доступ к неатомным свойствам или ivars из нескольких потоков может привести к неопределенному поведению, включая ошибки неправильного доступа.
Итак, если у вас есть такая переменная в Swift:
var object: NSObject
Могу ли я безопасно читать и записывать в эту переменную параллельно? (Без учета фактического значения этого).
objective-c
swift
лассей
источник
источник
@atomic
или@nonatomic
. или просто атомарно по умолчанию. (Swift настолько неполный, что мы не можем сейчас сказать много)atomic
обычно не считается достаточным для поточно-безопасного взаимодействия со свойством, за исключением простых типов данных. Для объектов обычно синхронизируют доступ между потоками с использованием блокировок (например,NSLock
или@synchronized
) или очередей GCD (например, последовательной очереди или параллельной очереди с шаблоном «читатель-писатель»).atomic
не обеспечивает потокобезопасность для объектов; и (б) если один должным образом использует одну из вышеупомянутых методов синхронизации , чтобы обеспечить безопасность потоков (среди прочего, предотвращая одновременное чтение / запись), атомный вопрос , является спорным. Но он нам все еще нужен / нужен для простых типов данных, которыеatomic
имеют реальную ценность. Хороший вопрос!Ответы:
Очень рано предполагать, что нет низкоуровневой документации, но вы можете изучить ее на сборке. Hopper Disassembler - отличный инструмент.
Использует
objc_storeStrong
иobjc_setProperty_atomic
для неатомных и атомных соответственно, гдеиспользует
swift_retain
fromlibswift_stdlib_core
и, по-видимому, не имеет встроенной защиты потоков.Мы можем предположить, что дополнительные ключевые слова (похожие на
@lazy
) могут быть введены позже.Обновление от 20.07.15 : согласно этому сообщению в блоге о синглтонах, быстрая среда может сделать некоторые случаи потокобезопасными для вас, например:
Обновление 25.05.16 : следите за предложением быстрой эволюции https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md - похоже, что это так будет возможно
@atomic
реализовать поведение самостоятельно.источник
Swift не имеет языковых конструкций для обеспечения безопасности потоков. Предполагается, что вы будете использовать предоставленные библиотеки для собственного управления безопасностью потоков. Существует множество вариантов реализации безопасности потоков, включая мьютексы pthread, NSLock и dispatch_sync в качестве механизма мьютекса. См. Недавнюю публикацию Майка Эша на эту тему: https://mikeash.com/pyblog/friday-qa-2015-02-06-locks-thread-safety-and-swift.html. Итак, прямой ответ на ваш вопрос «Может ли Я безопасно читаю и записываю в эту переменную параллельно? " нет.
источник
На этот вопрос, наверное, еще рано отвечать. В настоящее время в swift отсутствуют модификаторы доступа, поэтому не существует очевидного способа добавить код, который управляет параллелизмом, вокруг средства получения / установки свойств. Более того, похоже, что в Swift Language еще нет информации о параллелизме! (В нем также отсутствует KVO и т. Д ...)
Думаю, ответ на этот вопрос станет ясен в будущих выпусках.
источник
willSet
,didSet
- кажется, первый шаг на путиподробности
Ссылки
Реализованные типы
Главная мысль
Пример атомарного доступа
использование
Результат
источник
Atomic
класс и запустите его с помощьюAtomic().semaphoreSample()
Вот оболочка атомарных свойств, которую я широко использую. Я сделал реальный механизм блокировки протоколом, чтобы я мог экспериментировать с разными механизмами. Я пробовал семафоры
DispatchQueues
, иpthread_rwlock_t
.pthread_rwlock_t
Был выбран потому , что , как представляется , имеют самую низкую нагрузку, и меньше шансов на инверсии приоритетов.источник
Начиная с Swift 5.1, вы можете использовать оболочки свойств для создания определенной логики для ваших свойств. Это реализация атомарной оболочки:
Как пользоваться:
источник