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 იწყება მხოლოდ ბარიერის დავალების დასრულების შემდეგ.