Sobes.tech
Middle

Koja je razlika između semafora i mutexa?

sobes.tech АИ

Одговор од АИ

Семафор је општи механизам за синхронизацију који се користи за управљање приступом ограниченом ресурсу од стране више конкуренцијских нити. Он одржава целобројну вредност која се смањује приликом заузимања ресурса и повећава приликом ослобађања. Ако је вредност семафора нула, покушај заузимања блокира нит док друга нит не ослободи ресурс. Може се користити за ограничење броја истовремено радних нити.

Мутекс (mutual exclusion — међусобно искључивање) је бинарни семафор који може бити у блокираном или у откључаном стању. Користи се за заштиту критичне секције од истовременог приступа од стране више нити. Само једна нит може заузети мутекс у једном тренутку. Нит која је заузела мутекс не може бити прекинута од стране друге нити која покушава да га заузме. Ако покушате да заузмете блокирани мутекс, нит ће бити блокирана до његовог ослобађања.

Кључне разлике:

Карактеристика Семафор Мутекс
Тип Општи механизам за синхронизацију Бинарни семафор (посебан случај семафора)
Вредност Цело број (>= 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 ће се извршавати истовремено.