Sobes.tech
Middle

Ի՞նչ է սեմաֆորն ու մյուտեքսը:

sobes.tech AI

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

Սեմաֆորն ընդհանուր սինխրոնիզացիայի մեխանիզմ է, որը օգտագործվում է սահմանափակ ռեսուրսի մուտքի կառավարում բազմաթիվ մրցակցող հոսակների միջև: Այն պահպանում է ամբողջ թիվ, որը նվազում է ռեսուրսի գրավման ժամանակ և ավելանում՝ ազատելու ժամանակ: Եթե սեմաֆորի արժեքը զրոյ է, ապա գրավման փորձը բլոկավորում է հոսքը, մինչև որ մյուս հոսքը ազատի ռեսուրսը: Կարող է օգտագործվել միաժամանակ աշխատող հոսակների թվի սահմանափակման համար:

Մյուտեքս (միայնակ բացառություն — փոխադարձ բացառություն) — դա բինար սեմաֆոր է, որը կարող է լինել կամ բլոկավորված, կամ բացված: Այն օգտագործվում է կոդի քննադատական հատվածը պաշտպանելու համար միաժամանակյա մուտքից մի քանի հոսակների կողմից: Միայն մեկ հոսք կարող է գրավել մյուտեքսը ցանկացած ժամանակ: Մյուտեքսը գրաված հոսքը չի կարող խզվել մյուս հոսքի կողմից, որը փորձում է գրավել նույն մյուտեքսը: Եթե փորձեք գրավել բլոկավորված մյուտեքսը, հոսքը կբլոկավորվի մինչև այն ազատվի:

Հիմնական տարբերությունները:

Գծագրություն Սեմաֆոր Մյուտեքս
Տիպ Ընդհանուր սինխրոնիզացիայի մեխանիզմ Բինար սեմաֆոր (սեմաֆորի հատուկ դեպք)
Արժեք Բոլոր թվային (>= 0) Բինար (0 կամ 1)
Նպատակը Հասանելիության կառավարում ռեսուրսների, սահմանափակում Կատեգորիկ հատվածների պաշտպանություն, փոխադարձ բացառություն
Տիրապետողը Կարող է չունենալ տիրապետող Միշտ ունի տիրապետող (հոսքը, որը գրավել է այն)
Օգտագործում iOS-ում DispatchSemaphore Հաճախ իրականացնում է DispatchQueue.sync կամ NSRecursiveLock-ով որոշ սցենարներում

Օրինակ՝ մյուտեքս օգտագործելու համար՝

// GCD (Grand Central Dispatch) կոնտեքստում
let serialQueue = DispatchQueue(label: "com.example.criticalSection")

serialQueue.sync {
    // Կատեգորիկ հատվածի կոդ
    // Միաժամանակ միայն մեկ հոսք կարող է լինել այստեղ
}

Օրինակ՝ սեմաֆոր օգտագործելու համար՝

// GCD (Grand Central Dispatch) կոնտեքստում
let semaphore = DispatchSemaphore(value: 3) // թույլատրում է 3 միաժամանակյա աշխատանք

DispatchQueue.global().async {
    semaphore.wait() // Հանում է արժեքը 1-ով, բլոկավորում է, եթե արժեքը 0 է

    // Աշխատանքի կոդը, որը կատարվում է միաժամանակ
    print("Աշխատանքը կատարվում է")

    Thread.sleep(forTimeInterval: 1) // Նման աշխատանք

    semaphore.signal() // Ավելացնում է արժեքը 1-ով, բացում է սպասող հոսքը, եթե կա
    print("Աշխատանքը ավարտվեց")
}

// Կարող եք սկսել մի քանի նման բլոկներ, միայն 3-ը կաշխատեն միաժամանակ