Junior — Middle
Ce împiedică utilizarea sigură a colecțiilor într-un mediu multi-thread în Swift?
sobes.tech AI
Răspuns de la AI
În Swift, colecțiile standard (de exemplu, Array, Dictionary, Set) nu sunt sigure pentru utilizarea în mai multe fire de execuție. Aceasta înseamnă că accesul simultan la aceeași colecție din fire diferite fără sincronizare poate duce la condiții de cursă, corupție de date și comportament imprevizibil.
Motivul:
- Lipsa sincronizării încorporate: colecțiile nu utilizează blocări sau alte mecanisme de protecție în timpul modificărilor.
- Modificarea colecției în timpul iterării dintr-un alt fir poate duce la prăbușire.
Pentru utilizarea sigură într-un mediu multi-thread, este necesar să asigurați sincronizarea singur, de exemplu, cu:
- DispatchQueue cu bariere (barrier) pentru scriere
- NSLock sau alte primitive de blocare
- Utilizarea de învelișuri sau structuri de date sigure pentru fire
Exemplu de utilizare a DispatchQueue pentru sincronizarea accesului 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
}
}