Ի՞նչ հիմք ունեն շղթաներն ու սեմաֆորները։
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 {
// ...
}