Шартҳои рақобат (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) оварда расонад, агар нодуруст иҷро шавад.