Junior — Middle
Mis takistab Swiftis mitme niidiga keskkonnas kogumite ohutut kasutamist?
sobes.tech AI
Vastus AI-lt
Swift'i standardkogu (näiteks Array, Dictionary, Set) ei ole voolutõrje. See tähendab, et sama kogumi samaaegne kasutamine erinevatest voogudest ilma sünkroniseerimiseta võib põhjustada võistlusolukordi, andmete rikkumist ja ettearvamatut käitumist.
Põhjused:
- Sisseehitatud sünkroniseerimise puudumine: kogud ei kasuta lukke või muid kaitsemehhanisme muutmise ajal.
- Kogumi muutmine iteratsiooni ajal teise voogudest võib põhjustada krahhi.
Selleks, et seda turvaliselt kasutada mitmevoogulises keskkonnas, on vaja ise tagada sünkroniseerimine, näiteks:
- DispatchQueue barjääridega (barrier) kirjutamiseks
- NSLock või teiste lukku primitiividega
- Kasutades vooluturvalisi katteid või andmestruktuure
Näide DispatchQueue kasutamisest kogumi juurdepääsu sünkroniseerimiseks:
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
}
}