Sobes.tech
Junior — Middle

Оё сохтори додаи массив бехатариро дар дастрасии ҳамзамон аз чанд нӯг таъмин мекунад?

sobes.tech AI

Ҷавоб аз AI

Масивҳо дар iOS (масалан, NSArray ё Array дар Swift) ба таври пешфарз бехатар барои ҷараёнҳо нестанд. Ин маъно дорад, ки дар ҳоле ки ба онҳо ҳамзамон аз чанд ҷараён бе истифодаи иловагии синхронӣ дастрасӣ мешавад, метавонад ҳолати рақобат ба вуҷуд ояд, ки ба рафтори номуайян ё кати барнома оварда мерасонад.

Барои таъмини бехатарӣ дар дастрасии бисёрҷараёнҳо, бояд механизмҳои синхронӣ истифода шаванд, масалан, DispatchQueue бо бориҳо, NSLock ё дигар primitives-и синхронӣ. Дар Swift, инчунин, метавон DispatchQueue-ро бо хосияти .concurrent истифода бурда, бо методҳои sync ё async(flags: .barrier) барои хондан ва навиштани бехатар истифода кард.

Масалан, истифодаи DispatchQueue барои дастрасии бехатар ба массив:

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

Бо ин роҳ, массивҳо худ ба худ бехатариро дар ҳоле ки аз чанд ҷараён дастрасӣ мегиранд, таъмин намекунанд.