Sobes.tech
Middle+

Ի՞նչ է տեղի ունենում հորիզոնական հերթի հետ բարիերային օպերացիայի մեկնարկի ժամանակ։

sobes.tech AI

Պատասխան AI-ից

Համաժամանակյա հերթը ժամանակավորապես դառնում է հաջորդական: Բարերի առաջ կատարվող առաջադրանքները ավարտվում են, ապա կատարվում է միայն բարերի առաջադրանքը: Նոր առաջադրանքները չեն սկսվում բարերի ավարտից հետո: Բարի ավարտից հետո հերթը վերականգնում է համաժամանակյա կատարման մնացած առաջադրանքների համար:

Օրինակ async/await-ի օգտագործումը բարերով actor-ի վրա:

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

    func addData(_ item: String) { // Փոփոխական մեթոդ - բարեր
        data.append(item)
        print("Ավելացվել է \(item). Ընթացիկ տվյալներ: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Անփոփոխ
        // Չի պահանջում բարեր, կարող է կատարվել համաժամանակյա այլ անփոփոխների հետ
        DispatchQueue.global().async {
            // ինտենսիվ մշակում...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Անփոփոխ մեթոդ - բարեր չէ
        return data
    }
}

Օրինակ Grand Central Dispatch (GCD)-ի օգտագործումը բարերով:

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

func performTasks() {
    concurrentQueue.async {
        print("Առաջադրանք 1 սկսվեց")
        Thread.sleep(forTimeInterval: 1) // Նմանեց աշխատանքը
        print("Առաջադրանք 1 ավարտվեց")
    }

    concurrentQueue.async {
        print("Առաջադրանք 2 սկսվեց")
        Thread.sleep(forTimeInterval: 1)
        print("Առաջադրանք 2 ավարտվեց")
    }

    // Բարերային առաջադրանք
    concurrentQueue.async(flags: .barrier) {
        print("Բարերի առաջադրանք սկսվեց")
        Thread.sleep(forTimeInterval: 2) // Նմանեց աշխատանքը, որը պահանջում է բացառիկ մուտք
        print("Բարերի առաջադրանք ավարտվեց")
    }

    concurrentQueue.async {
        print("Առաջադրանք 3 սկսվեց")
        Thread.sleep(forTimeInterval: 1)
        print("Առաջադրանք 3 ավարտվեց")
    }

    concurrentQueue.async {
        print("Առաջադրանք 4 սկսվեց")
        Thread.sleep(forTimeInterval: 1)
        print("Առաջադրանք 4 ավարտվեց")
    }
}

// Արդյունքը ցույց կտա, որ Task 3 և Task 4 սկսվում են միայն Բարերի առաջադրանքի ավարտից հետո: