Sobes.tech
Junior

Ի՞նչ է մրցակցային պայմանը։

sobes.tech AI

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

Ռեյսի վիճակը — դա խնդիր է, որը առաջանում է բազմաթերթային կամ բազմապրոցեսային հավելվածում, երբ արդյունքի ճշգրտությունը կախված է թերթերի/պրոցեսների կատարման կարգից:

Սովորաբար առաջանում է միաժամանակ մի քանի թերթերի մուտքը ընդհանուր ռեսուրսներին (փոփոխականներ, ֆայլեր, տվյալների բազաներ) առանց համապատասխան սինխրոնիզացիայի:

Նպաստում է անորոշ վարքագծին, սխալներին և ոչ ճշգրիտ տվյալներին:

Օրինակ՝ երկու թերթերը միաժամանակ փորձում են մեծացնել ընդհանուր փոփոխականը:

var sharedCounter = 0

func incrementCounter() {
    let currentValue = sharedCounter // Թերթ 1-ը կարդում է 0
    // Որոշակի ձգում
    let newValue = currentValue + 1 // Թերթ 1-ը հաշվում է 1
    sharedCounter = newValue // Թերթ 1-ը գրում է 1
}

// Եթե Թերթ 2-ը կարդում է currentValue-ը մինչեւ Թերթ 1-ը գրի newValue-ը՝
func anotherIncrementCounter() {
    let currentValue = sharedCounter // Թերթ 2-ը կարդում է 0
    let newValue = currentValue + 1 // Թերթ 2-ը հաշվում է 1
    sharedCounter = newValue // Թերթ 2-ը գրում է 1
}

Այս օրինակով, եթե երկու թերթերն էլ կատարվում են միաժամանակ առանց սինխրոնիզացիայի, ապա sharedCounter-ը կարող է դառնալ 1, փոխարենը սպասված 2-ի:

Սինխրոնիզացիայի մեխանիզմները օգտագործվում են ռիսկերից խուսափելու համար՝

  • Մյուտեքսներ (Mutex): Բլոկավորում են ռեսուրսի մուտքը, թույլ տալով միայն մեկ թերթին լինել քննական հատվածում:
  • Սեմաֆորներ (Semaphore): սահմանափակում են միաժամանակ ռեսուրսին մուտք գործող թերթերի քանակը:
  • Համակարգեր (Dispatch Queues GCD-ում): Թվարկումները կատարվում են հերթական (Serial Queue) կամ որոշակի մակարդակի պարանլելիզմով (Concurrent Queue)՝ մուտքի սինխրոնիզացիայի հնարավորությամբ:
  • Բլոկավորումներ (Locks): Տարբեր տեսակի բլոկավորումներ (օրինակ, NSLock, NSRecursiveLock):
  • Ատոմարային օպերացիաներ (Atomic Operations): Համոզված են, որ օպերացիան (կարդալ, գրել, ինկրեմենտ) կատարվում է ատոմարային կերպով՝ առանց այլ թերթի միջամտության:

iOS մշակման ժամանակ հաճախ օգտագործվում են Grand Central Dispatch (GCD) և Operation Queues՝ թերթերի կառավարում և ռիսկերի կանխարգելում։ Սերիական Dispatch Queues ապահովում են ավտոմատ սինխրոնիզացիա՝ կատարվող առաջադրանքների համար։