Sobes.tech
Middle+

Barjer operatsiyasini boshlash bilan parallel navbatda nima bo'ladi?

sobes.tech AI

AIdan javob

Paralel navbat vaqtinchalik ketma-ket navbaga aylantiriladi. Barrierdan oldin bajarilayotgan vazifalar tugaydi, so'ng faqat barrier vazifasi bajariladi. Yangi vazifalar ishga tushirilmaydi barrier vazifasi tugaguniga qadar. Barrier vazifasi tugagach, navbat qolgan vazifalar uchun parallel bajarilishga qaytadi.

async/await bilan actor asosidagi barrier misoli:

actor SharedDataManager {
    private var data: [String] = ["Initial"]

    func addData(_ item: String) { // O'zgartiruvchi metod - barrier
        data.append(item)
        print("Qo'shildi \(item). Joriy ma'lumotlar: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // O'zgartirmasdan
        // Barrier talab qilinmaydi, boshqa o'zgartirmasdan vazifalar bilan parallel bajarilishi mumkin
        DispatchQueue.global().async {
            // Intensiv ishlov berish...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // O'zgartirmasdan metod - barrier emas
        return data
    }
}

Grand Central Dispatch (GCD) bilan barrier misoli:

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

func performTasks() {
    concurrentQueue.async {
        print("Vazifa 1 boshlandi")
        Thread.sleep(forTimeInterval: 1) // Ishni simulyatsiya qilish
        print("Vazifa 1 tugadi")
    }

    concurrentQueue.async {
        print("Vazifa 2 boshlandi")
        Thread.sleep(forTimeInterval: 1)
        print("Vazifa 2 tugadi")
    }

    // Barrier vazifa
    concurrentQueue.async(flags: .barrier) {
        print("Barrier vazifa boshlandi")
        Thread.sleep(forTimeInterval: 2) // Ekskluziv kirishni talab qiladigan ish
        print("Barrier vazifa tugadi")
    }

    concurrentQueue.async {
        print("Vazifa 3 boshlandi")
        Thread.sleep(forTimeInterval: 1)
        print("Vazifa 3 tugadi")
    }

    concurrentQueue.async {
        print("Vazifa 4 boshlandi")
        Thread.sleep(forTimeInterval: 1)
        print("Vazifa 4 tugadi")
    }
}

// Natija shuni ko'rsatadiki, Vazifa 3 va Vazifa 4 faqat Barrier vazifa tugagandan so'ng boshlanadi.