Middle+
Mi történik a párhuzamos sorral a sorompó művelet indításakor?
sobes.tech MI
Válasz az MI-től
A párhuzamos sor ideiglenesen szekvenciális sorozattá válik. A barrier előtt végrehajtott feladatok befejeződnek, majd csak a barrier feladat fut le. Új feladatok nem indulnak el, amíg a barrier feladat be nem fejeződik. A barrier feladat befejezése után a sor párhuzamos végrehajtásba tér vissza a fennmaradó feladatokra.
Példa az async/await használatára egy actor alapú barrierrel:
actor SharedDataManager {
private var data: [String] = ["Initial"]
func addData(_ item: String) { // Módosító metódus - barrier
data.append(item)
print("Hozzáadva \(item). Jelenlegi adatok: \(data)")
}
func processData(completion: @escaping ([String]) -> Void) { // Nem módosító
// Nem igényel barrier-t, párhuzamosan futtatható más nem módosító feladatokkal
DispatchQueue.global().async {
// Intenzív feldolgozás...
let result = self.data.map { $0.uppercased() }
completion(result)
}
}
func getData() -> [String] { // Nem módosító metódus - nem barrier
return data
}
}
Grand Central Dispatch (GCD) barrier példával:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
func performTasks() {
concurrentQueue.async {
print("Feladat 1 indult")
Thread.sleep(forTimeInterval: 1) // Munka szimulálása
print("Feladat 1 befejeződött")
}
concurrentQueue.async {
print("Feladat 2 indult")
Thread.sleep(forTimeInterval: 1)
print("Feladat 2 befejeződött")
}
// Barrier feladat
concurrentQueue.async(flags: .barrier) {
print("Barrier feladat indult")
Thread.sleep(forTimeInterval: 2) // Munka, amely kizárólagos hozzáférést igényel
print("Barrier feladat befejeződött")
}
// További feladatok
concurrentQueue.async {
print("Feladat 3 indult")
Thread.sleep(forTimeInterval: 1)
print("Feladat 3 befejeződött")
}
concurrentQueue.async {
print("Feladat 4 indult")
Thread.sleep(forTimeInterval: 1)
print("Feladat 4 befejeződött")
}
}
// A kimenet megmutatja, hogy a Feladat 3 és Feladat 4 csak a Barrier feladat befejezése után kezdődnek.