Middle+
Barier əməliyyatı başladıqda paralel növbədə nə baş verir?
sobes.tech Süni İntellekt
AI-dan cavab
Paralel növbə müvəqqəti olaraq ardıcıl növbəyə çevrilir. Barrierdən əvvəl yerinə yetirilən tapşırıqlar tamamlanır, sonra yalnız barrier tapşırığı icra olunur. Yeni tapşırıqlar başladılmır barrier tapşırığı tamamlanana qədər. Barrier tapşırığı tamamlandıqdan sonra növbə qalan tapşırıqlar üçün paralel icraya davam edir.
async/await istifadə nümunəsi ilə actor əsaslı barrier:
actor SharedDataManager {
private var data: [String] = ["Initial"]
func addData(_ item: String) { // Dəyişdirici metod - barrier
data.append(item)
print("Əlavə olundu \(item). Mövcud məlumatlar: \(data)")
}
func processData(completion: @escaping ([String]) -> Void) { // Dəyişdirilməz
// Barrier tələb edilmir, digər dəyişdirilməz tapşırıqlarla paralel icra oluna bilər
DispatchQueue.global().async {
// Yoğun emal...
let result = self.data.map { $0.uppercased() }
completion(result)
}
}
func getData() -> [String] { // Dəyişdirilməz metod - barrier deyil
return data
}
}
Grand Central Dispatch (GCD) ilə barrier nümunəsi:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
func performTasks() {
concurrentQueue.async {
print("Tapşırıq 1 başladı")
Thread.sleep(forTimeInterval: 1) // İş simulyasiyası
print("Tapşırıq 1 bitdi")
}
concurrentQueue.async {
print("Tapşırıq 2 başladı")
Thread.sleep(forTimeInterval: 1)
print("Tapşırıq 2 bitdi")
}
// Barrier tapşırığı
concurrentQueue.async(flags: .barrier) {
print("Barrier tapşırığı başladı")
Thread.sleep(forTimeInterval: 2) // Eksklüziv giriş tələb edən iş
print("Barrier tapşırığı bitdi")
}
concurrentQueue.async {
print("Tapşırıq 3 başladı")
Thread.sleep(forTimeInterval: 1)
print("Tapşırıq 3 bitdi")
}
concurrentQueue.async {
print("Tapşırıq 4 başladı")
Thread.sleep(forTimeInterval: 1)
print("Tapşırıq 4 bitdi")
}
}
// Çıxış Barrier tapşırığı tamamlandıqdan sonra Task 3 və Task 4-ün başladığını göstərəcək.