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 սկսվում են միայն Բարերի առաջադրանքի ավարտից հետո: