Ի՞նչ է սեմաֆորն ու մյուտեքսը:
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-ը կաշխատեն միաժամանակ