Sobes.tech
Junior — Middle

Mi akadályozza a gyűjtemények biztonságos használatát a Swift több szálas környezetében?

sobes.tech MI

Válasz az MI-től

Swiftben a standard kollekciók (például Array, Dictionary, Set) nem szálbiztosak. Ez azt jelenti, hogy ugyanazon kollekcióhoz több szálból való egyidejű hozzáférés szinkronizáció nélkül versenyhelyzetekhez, adatsérüléshez és kiszámíthatatlan viselkedéshez vezethet.

Okok:

  • Beépített szinkronizáció hiánya: a kollekciók nem használnak zárolásokat vagy más védelmi mechanizmusokat módosításkor.
  • A kollekció módosítása egy másik szálból történő iterálás közben összeomláshoz vezethet.

Biztonságos több szálas környezetben való használathoz saját magának kell biztosítania a szinkronizációt, például:

  • DispatchQueue zárolásokkal (barrier) az íráshoz
  • NSLock vagy más zárolási primitívek használatával
  • Szálbiztos burkolatok vagy adatszerkezetek alkalmazásával

Példa a DispatchQueue használatára a hozzáférés szinkronizálására egy tömb esetében:

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