Race condition (состояние гонки) происходит, когда несколько потоков одновременно обращаются к общему изменяемому состоянию, причём хотя бы один из них пишет в него. Это приводит к непредсказуемому поведению и сложно воспроизводимым ошибкам.
Serial Dispatch Queues — гарантируют, что только одна задача обращается к общему состоянию одновременно:
let queue = DispatchQueue(label: "com.app.serialQueue")
queue.async { self.sharedResource = newValue }
Locks — используй NSLock или os_unfair_lock для более точного контроля:
let lock = NSLock()
lock.lock()
sharedResource = newValue
lock.unlock()
Semaphores — контролируют доступ с помощью ограниченного числа одновременных операций:
let semaphore = DispatchSemaphore(value: 1)
semaphore.wait()
defer { semaphore.signal() }
actor DataStore {
var value: Int = 0
func update(_ newValue: Int) { value = newValue }
}
@Sendable к замыканиям и типам, чтобы предотвратить небезопасную передачу данных через границы concurrencyasync/await перед ручным управлением потоками, чтобы снизить сложностьСамый безопасный и современный подход в Swift — использовать actors и встроенную модель structured concurrency. Оставляй низкоуровневые инструменты вроде locks и semaphores для критичного по производительности кода или при взаимодействии с legacy-системами.
Для возникновения race condition необходимо, чтобы как минимум два потока одновременно писали в одно и то же общее изменяемое состояние.
Новый — ещё не проверен сообществом
Вы