Sobes.tech
Middle

Обяснете какво е data race в контекста на многопоточната разработка.

sobes.tech AI

Отговор от AI

Състезание за данни е състояние, при което няколко нишки или процеси едновременно достъпват една и съща област от паметта (променлива, обект) и поне една от тях извършва запис, без никаква синхронизация на достъпа.

Последиците от състезанието за данни са непредсказуеми и могат да включват:

  • Неправилни стойности на променливите.
  • Сривове на приложението.
  • Други трудноуловими грешки.

Пример за състезание за данни в Swift:

// Незащитен брояч
var counter = 0

// Функция, която увеличава брояча в нишка
func incrementCounter() {
    for _ in 0..<1000 {
        counter += 1 // Тук се случва състезание за данни
    }
}

// Създаване и стартиране на няколко нишки
let queue = DispatchQueue.global()
queue.async {
    incrementCounter()
}

queue.async {
    incrementCounter()
}

// В резултат, counter може да не е равен на 2000

Начини за предотвратяване на състезание за данни:

  • Блокировки (Locks): NSLock, os_unfair_lock.
  • Мютекси: Използват се с pthread_mutex.
  • Семафори: DispatchSemaphore.
  • Конкурентни опашки с бариери: DispatchQueue(label: "myQueue", attributes: .concurrent) с флаг .barrier при писане.
  • Synchronized (Objective-C): @synchronized.
  • Атомарни операции: Използване на атомарни типове като AtomicBool.
  • Структури от данни, безопасни за конкурентен достъп: Например, NSCache или специализирани библиотеки.