Middle
Ի՞նչ է սեմաֆորը ծրագրավորման համատեքստում։
sobes.tech AI
Պատասխան AI-ից
Սեմաֆորն այն սինխրոնիզացիայի պրիմիտիվն է, որը կառավարում է հոսքերի մուտքը սահմանափակ ռեսուրսին: Այն պահպանում է ամբողջ թվային հաշվիչ:
Հիմնական գործողություններ՝
wait()(կամP/acquire): նվազեցնում է հաշվիչը 1-ով: Եթե հաշվիչը դառնում է բացասական, հոսքը բլոկվում է մինչև մյուս հոսքը կատարիsignal():signal()(կամV/release): ավելացնում է հաշվիչը 1-ով: Եթե բլոկավորված հոսքեր կան, մեկը նրանցից բացվում է:
Սեմաֆորների տեսակները՝
- Բինար սեմաֆոր (մյուտեքս): Հաշվիչը ընդունում է 0 կամ 1 արժեքները: Օգտագործվում է փոխադարձ բացառության ապահովման համար՝ միայն մեկ հոսք կարող է միաժամանակ մուտք ունենալ ռեսուրսին:
- Հաշվիչ սեմաֆոր: Հաշվիչը կարող է ընդունել արժեքներ 0-ից N: Օգտագործվում է սահմանափակ քանակությամբ ռեսուրսների պուլին մուտքի կառավարման համար:
Օրինակ Swift-ով՝ միաժամանակ աշխատող խնդիրների քանակը սահմանափակելու համար՝
// Սեմաֆոր ստեղծում՝ թույլ տալով մինչև 3 միաժամանակ մուտք
let semaphore = DispatchSemaphore(value: 3)
DispatchQueue.global().async {
// Առաջին խնդիր
semaphore.wait() // նվազեցնում է հաշվիչը, բլոկավորում է, եթե > 3 խնդիր աշխատում
print("Առաջին խնդիր սկսվեց")
Thread.sleep(forTimeInterval: 2) // աշխատանքը սիմուլացնում է
print("Առաջին խնդիր ավարտվեց")
semaphore.signal() // ավելացնում է հաշվիչը, բացում սպասող խնդիրները
}
DispatchQueue.global().async {
// Երկրորդ խնդիր
semaphore.wait()
print("Երկրորդ խնդիր սկսվեց")
Thread.sleep(forTimeInterval: 3)
print("Երկրորդ խնդիր ավարտվեց")
semaphore.signal()
}
DispatchQueue.global().async {
// Երրորդ խնդիր
semaphore.wait()
print("Երրորդ խնդիր սկսվեց")
Thread.sleep(forTimeInterval: 1)
print("Երրորդ խնդիր ավարտվեց")
semaphore.signal()
}
DispatchQueue.global().async {
// Չորրորդ խնդիր (կպահի սպասել, մինչև ազատվի սլոտը)
semaphore.wait()
print("Չորրորդ խնդիր սկսվեց")
Thread.sleep(forTimeInterval: 2)
print("Չորրորդ խնդիր ավարտվեց")
semaphore.signal()
}
// Սպասում ենք բոլոր խնդիրների ավարտին՝ ցուցադրության համար
// Օգտագործեք ավելի հուսալի մեխանիզմներ սպասելու համար՝
Thread.sleep(forTimeInterval: 5)