Sobes.tech
Middle

Семафор менен мютекс арасындагы айырма эмне?

sobes.tech AI

AIден жооп

Семафор — бул жалпы синхрондоштуруу механизми, ал бир нече атаандаштык жиптердин ортосунда чектелген ресурска кирүүнү башкаруу үчүн колдонулат. Ал бүтүн санды сактайт, ал ресурска ээ болгондо азаяды жана бошотулганда көбөйөт. Эгер семафордун мааниси нөлгө барабар болсо, алууга аракет кылуу жипти блоктоп, башка жип ресурсты бошотконго чейин күтөт. Ал бир убакта иштеп жаткан жиптердин санын чектөө үчүн колдонулушу мүмкүн.

Мьютекс (өз ара айыруу — өз ара ажыратуу) — бул бинардык семафор, ал же блоктолгон, же бошотулган болушу мүмкүн. Ал коддун критикалык бөлүгүн бир мезгилде бир нече жиптин киришинен коргоо үчүн колдонулат. Жай гана бир жип мьютекс алса болот. Мьютекс алгандан кийин, ал башка жип тарабынан үзүлбөйт, ал ошол мьютекс алууга аракет кылып жатат. Эгер блоктолгон мьютекс алууга аракет кылса, жип анын бошотулушун күтөт.

Негизги айырмачылыктар:

Өзгөчөлүк Семaфор Мьютекс
Тип Жалпы синхрондоштуруу механизми Бинардык семафор (семафордун өзгөчө түрү)
Маани Бүтүн сан (>= 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() // Семaфор маанисин 1-ге төмөндөтөт. Эгер мааниси 0 болсо, блоктоп турат.

    // Параллелдүү аткарылуучу тапшырманын коду
    print("Тапшырма аткарылууда")

    Thread.sleep(forTimeInterval: 1) // Иштөө имитациясы

    semaphore.signal() // Семaфор маанисин 1-ге жогорулатат. Күтүп жаткан жипти бошотот, эгер бар болсо.
    print("Тапшырма аяктады")
}

// Мындай бир нече блокту ишке киргизсе болот. Жай гана 3 иштейт бир убакта.