Sobes.tech
Middle+

Барьер операциясын ишке ашырганда параллелдик кезек менен эмне болот?

sobes.tech AI

AIден жооп

Параллельдүү кезек убактылуу последовательдүү болуп калат. Барьерге чейинки аткарылып жаткан тапшырмалар аяктап, андан кийин гана барьер тапшырмасы аткарылат. Жаңы тапшырмалар жок деп эсептелет, барьер аяктагандан кийин гана ишке кирет. Барьер тапшрамасы аяктагандан кийин кезек калган тапшырмаларды аткаруу үчүн кайра параллелдүү ишке кирет.

async/`await`` менен барьер колдонуу мисалы:

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("Task 1 башталды")
        Thread.sleep(forTimeInterval: 1) // Иштөө моделдөө
        print("Task 1 аяктады")
    }

    concurrentQueue.async {
        print("Task 2 башталды")
        Thread.sleep(forTimeInterval: 1)
        print("Task 2 аяктады")
    }

    // Барьер тапшырмасы
    concurrentQueue.async(flags: .barrier) {
        print("Барьер тапшырмасы башталды")
        Thread.sleep(forTimeInterval: 2) // Эксклюзивдүү кирүү талап кылынган иш
        print("Барьер тапшырмасы аяктады")
    }

    concurrentQueue.async {
        print("Task 3 башталды")
        Thread.sleep(forTimeInterval: 1)
        print("Task 3 аяктады")
    }

    concurrentQueue.async {
        print("Task 4 башталды")
        Thread.sleep(forTimeInterval: 1)
        print("Task 4 аяктады")
    }
}

// Натыйжа Task 3 жана Task 4 Барьер тапшырмасы аяктагандан кийин гана башталары көрсөтүлөт.