Sobes.tech
Junior — Middle

Kasandmassiivi andmesstruktuur tagab turvalisuse mitme niidiga samaaegsel juurdepääsul?

sobes.tech AI

Vastus AI-lt

Arrayd iOS-is (näiteks NSArray või Array Swiftis) ei ole vaikimisi joonistatud. See tähendab, et samaaegne juurdepääs mitmest niidist ilma täiendava sünkroniseerimiseta võib põhjustada võistlusolukorra, mis viib ettearvamatu käitumise või rakenduse kokkuvarisemiseni.

Selleks, et tagada turvaline juurdepääs mitme niidiga, tuleb kasutada sünkroniseerimismehhanisme, näiteks DispatchQueue barjääridega, NSLock või muid sünkroniseerimise primitiive. Swiftis saab samuti kasutada DispatchQueue koos .concurrent atribuudiga ja meetodeid sync või async(flags: .barrier) turvaliseks lugemiseks ja kirjutamiseks.

Näide DispatchQueue kasutamisest turvaliseks juurdepääsuks massiivile:

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 index < self.array.count {
                result = self.array[index]
            }
        }
        return result
    }
}

Selle meetodiga ei taga massiivid ise turvalisust samaaegse juurdepääsu korral mitmest niidist.