Sobes.tech
Junior — Middle

Structura de date array asigură siguranța la accesul simultan din mai multe fire?

sobes.tech AI

Răspuns de la AI

Array-urile în iOS (de exemplu, NSArray sau Array în Swift) nu sunt sigure pentru fire în mod implicit. Aceasta înseamnă că, la accesul simultan din mai multe fire fără sincronizare suplimentară, poate apărea o condiție de cursă, ceea ce va duce la comportament imprevizibil sau la blocarea aplicației.

Pentru a asigura siguranța în accesul multi-thread, trebuie utilizate mecanisme de sincronizare, cum ar fi DispatchQueue cu bariere, NSLock sau alte primitive de sincronizare. În Swift, se poate folosi și DispatchQueue cu atributul .concurrent și metodele sync sau async(flags: .barrier) pentru citire și scriere sigură.

Exemplu de utilizare a DispatchQueue pentru acces sigur la un array:

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
    }
}

Prin urmare, array-urile în sine nu asigură siguranța la accesul simultan din mai multe fire.