Sobes.tech
Middle

Ի՞նչ հիմք ունեն շղթաներն ու սեմաֆորները։

sobes.tech AI

Պատասխան AI-ից

Կաշառքներ և սեմաֆորներ համատեղ ծրագրավորման համատեքստում հիմնված են սինխրոնիզացիայի մեխանիզմների վրա.

  • Սեմաֆորներ: Հիմնված են հաշվիչի վրա գործող անատոմիկ օպերացիաների վրա: Հիմնական օպերացիաները՝

    • wait (կամ P, acquire): Հաշվիչը նվազեցնում է: Եթե հաշվիչը դառնում է բացասական, ապա հոսքը բլոկվում է մինչև մյուս հոսքը կատարի signal:
    • signal (կամ V, release): Հաշվիչը ավելացնում է: Եթե բլոկավորված հոսքեր կան, մեկը նրանցից արթնանում է:
    • Սեմաֆորները կարող են լինել բինար (արժեքը 0 կամ 1, գործածվում են մյուտեքսների նման) կամ հաշվող (թույլատրում է սահմանափակ քանակությամբ հոսքերի մուտք դեպի ռեսուրս):
  • Կաշառքներ (Barriers): Հիմնված են բոլոր մասնակիցների սպասման մեխանիզմի վրա: Հոսքը, որը հասնում է կաշառքին, բլոկվում է մինչև բոլոր մյուս մասնակիցները, որոնք մասնակցում են սինխրոնիզացիային, նույնպես հասնեն այդ կաշառքին: Երբ բոլորը հասնում են, նրանք միաժամանակ շարունակում են գործել:

Այս կոնցեպցիաները iOS/macOS ծրագրավորման մեջ իրականացնում են GCD (Grand Central Dispatch) և OperationQueue ֆրեյմվորկների միջոցով:

Օրինակ, GCD-ում:

// Օրինակ `DispatchSemaphore`-ի օգտագործմամբ
let semaphore = DispatchSemaphore(value: 1) // Բինար սեմաֆոր

// սպասում (acquire)
semaphore.wait()
// Կատարվում է քննադատական հատված
semaphore.signal() // ազդանշան (release)

GCD-ում կաշառքները իրականացնում են բարերային առաջադրանքների (barrier tasks) միջոցով համատեղ հերթականության համար:

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

// սովորական առաջադրանքներ
concurrentQueue.async {
    // ...
}

// բարերային առաջադրանք - կատարվում է միայն երբ բոլոր նախորդ սովորական առաջադրանքները ավարտվեն
// և հետո բարերային առաջադրանքի ավարտից հետո նոր առաջադրանքները չեն սկսվի մինչև այն ավարտվի
concurrentQueue.async(flags: .barrier) {
    // ...
}

// սովորական առաջադրանքներ, որոնք սկսում են կատարվել բարերային ավարտից հետո
concurrentQueue.async {
    // ...
}