Sobes.tech
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)