Sobes.tech
Junior — Middle

Šta sprečava sigurno korišćenje kolekcija u višestrukom okruženju u Swift-u?

sobes.tech АИ

Одговор од АИ

U Swift-u, standardne kolekcije (npr. Array, Dictionary, Set) nisu sigurni za višestruko pokretanje niti. To znači da istovremeni pristup istoj kolekciji iz različitih niti bez sinhronizacije može dovesti do trkaćih uslova, oštećenja podataka i nepredvidivog ponašanja.

Razlozi:

  • Nedostatak ugrađene sinhronizacije: kolekcije ne koriste zaključke ili druge mehanizme zaštite tokom modifikacija.
  • Modifikacija kolekcije tokom iteracije iz druge niti može izazvati pad.

Za sigurno korišćenje u višestrukim nitima, potrebno je samostalno obezbediti sinhronizaciju, na primer, pomoću:

  • DispatchQueue sa barijerama (barrier) za zapis
  • NSLock ili drugih primitiveskih zaključavanja
  • Korišćenja sigurnih za niti omotača ili struktura podataka

Primer korišćenja DispatchQueue za sinhronizaciju pristupa nizu:

class ThreadSafeArray<T> {
    private var array = [T]()
    private let queue = DispatchQueue(label: "com.example.threadSafeArray", attributes: .concurrent)

    func append(_ element: T) {
        queue.async(flags: .barrier) {
            self.array.append(element)
        }
    }

    func get(at index: Int) -> T? {
        var result: T?
        queue.sync {
            if array.indices.contains(index) {
                result = array[index]
            }
        }
        return result
    }
}