Sobes.tech
Junior — Middle

Sunt colecțiile din Swift sigure pentru fire pentru lucrul multi-thread?

sobes.tech AI

Răspuns de la AI

Colecțiile din Swift (de exemplu, Array, Dictionary, Set) nu sunt sigure pentru fire în mod implicit. Aceasta înseamnă că accesul simultan din mai multe fire fără sincronizare poate duce la comportament imprevizibil și erori.

Pentru a lucra în siguranță cu colecțiile într-un mediu multi-thread, trebuie utilizate mecanisme de sincronizare, de exemplu:

  • Cozi DispatchQueue cu bariere (barrier) pentru scriere
  • NSLock sau alte obiecte de blocare
  • Învelișuri specializate sigure pentru fire

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 array.indices.contains(index) {
                result = array[index]
            }
        }
        return result
    }
}

Prin urmare, pentru a lucra în siguranță cu colecțiile în codul multi-threaded Swift, este necesar să se aplice mecanisme suplimentare de sincronizare.