Sobes.tech
Middle

Шартҳои рақобат (race condition) чист?

sobes.tech AI

Ҷавоб аз AI

Ҳолати рақобат ҳодисаест, вақте ки ду ё бештар аз раванд ё ҷараён ҳамзамон ба манбаи умумӣ (масалан, тағирёбанда, файл, базаи додаҳо) дастрасӣ мекунанд ва натиҷаи амалиёт вобаста аст аз тартиби иҷрои онҳо. Ба сабаби тартиби номуайян дар дастрасӣ ва тағир додани маълумотҳо, натиҷа метавонад нодуруст ё ғайричашмдошт бошад.

Масалан дар iOS: Мегӯем, ки мо ҳисобкунак count дорем, ки ду раванд ҳамзамон ба он барои афзоиш дастрасӣ мекунанд.

var count = 0

func incrementCount() {
    // Раванд 1 count = 5 мехонад
    // Раванд 2 count = 5 мехонад
    let currentCount = count
    // Раванд 1 ҳисоб мекунад newCount = 6
    // Раванд 2 ҳисоб мекунад newCount = 6
    let newCount = currentCount + 1
    // Раванд 1 менависад count = 6
    // Раванд 2 менависад count = 6 (нависиши дубора барои натиҷаи Раванд 1)
    count = newCount
}

// Агар ду раванд ҳамзамон call-и incrementCount() кунанд,
// натиҷаи интизор count = 2,
// аммо бо сабаби ҳолати рақобат, count метавонад ба 1 баробар шавад.

Барои пешгирӣ кардани ҳолатҳои рақобат, механизмҳои ҳамоҳангсозӣ истифода мешаванд:

  • Lock/Mutex: Мубориза мекунад, ки дастрасӣ ба манбаъ то он дам, ки раванд онро истифода мебарад, баста шавад.
    import Foundation
    
    let lock = NSLock()
    var count = 0
    
    func incrementCount() {
        lock.lock() // Бастани lock
        let currentCount = count
        let newCount = currentCount + 1
        count = newCount
        lock.unlock() // Бозгашти lock
    }
    
  • Қатори (Queues): Истифодаи қаторҳои пайдарпайи GCD.
    import Foundation
    
    let serialQueue = DispatchQueue(label: "com.myapp.counterQueue")
    var count = 0
    
    func incrementCount() {
        serialQueue.async {
            let currentCount = count
            let newCount = currentCount + 1
            count = newCount
        }
    }
    
  • Оператсияҳои атомӣ: Оператсияҳои беайб дар сатҳи дастурҳои процессор. Дар Swift, метавон истифода бурд OSAtomic... (ки аллакай кӯҳна шудааст) ё Atomic аз @_implementationOnly import Atomics (эксперименталӣ), ё роҳҳои асосёфта ба блокировкаҳо/қаторҳо.

Интихоби усули ҳамоҳангсозӣ вобаста ба сенария ва талаботҳои иҷроиш аст. Муҳим аст, ки фаҳмед, ки ҳамоҳангсозӣ метавонад борро илова кунад ва эҳтимолан ба монеа (deadlock) оварда расонад, агар нодуруст иҷро шавад.