Sobes.tech
Middle+

Шумо дар бораи мушкили хонанда ва нависанда чӣ медонед?

sobes.tech AI

Ҷавоб аз AI

Масъалаи хонанда ва нависанда — ин вазифаи классикии ҳамоҳангсозии дастрасӣ ба маълумоти умумӣ дар муҳити бисёртана мебошад.

Маънии масъала:

  • Множи танаҳо (хонандагон) ҳамзамон маълумотҳоро мехонанд.
  • Множи танаҳо (нависандагон) ҳамзамон маълумотҳоро тағйир медиҳанд.

Талабот:

  • Ҳонандагон метавонанд бидуни маҳдудият ҳамзамон мехонанд.
  • Нависандагон дастрасии истисноӣ ба маълумот доранд (то он ки нависанда кор мекунад, дигарон — на хонанда, на нависанда — наметавонанд дастрасӣ гиранд).
  • Танҳо як нависанда метавонад ҳамзамон кор кунад.
  • Агар нависанда интизор бошад, хонандагони нав набояд дастрасӣ гиранд, то он ки нависанда кори худро ба анҷом расонад. Ин қоида "ғолибон"-ро пешгирӣ мекунад.

Ҳалҳо дар iOS:

  • NSLock: Механизми соддатарин, аммо барои ин вазифа оптималӣ нест, зеро ҳам хондан ва ҳам навиштро мепӯшонад.

  • NSRecursiveLock: Имкон медиҳад, ки як тана метавонад чанд маротиба блокро бигирад. Истифода намешавад.

  • NSCondition: Механизми бештарфунксионалӣ, имкон медиҳад, ки танаҳо интизор шаванд, то шароити муайян иҷро шавад. Барои иҷрои логикаи хонандагон/нависандагон истифода бурда мешавад, аммо ниёз ба идоракунии дастӣ ва шароитҳо дорад.

  • Serial Dispatch Queue (GCD): Таҳия кардани як навбатии пайдарпай барои ҳамаи амалиётҳои хондан ва навиштан. Навбатҳо синхрон иҷро мешаванд, хондан метавонад асинхрон бошад, аммо танҳо пас аз анҷоми амалиёти қаблӣ. Ин ҳалли содда аст, аммо барои иҷрои хондан оптималӣ нест, зеро хондан наметавонад параллелӣ бошад.

    let readWriteQueue = DispatchQueue(label: "com.example.readwrite", attributes: .concurrent)
    
    func readData() {
        readWriteQueue.async {
            // Логикаи хондани маълумот
            print("Маълумот хонда мешавад...")
        }
    }
    
    func writeData() {
        readWriteQueue.sync(flags: .barrier) {
            // Логикаи навиштани маълумот
            print("Маълумот навишта мешавад...")
        }
    }
    
  • Конкурентии навбат бо бариер (GCD): Ин ҳалли беҳтарин дар аксар ҳолатҳо. Барои иҷрои параллелии амалиётҳои хондан истифодаи навбатии рақобатӣ. Барои амалиётҳои навиштани маълумот истифодаи флаги .barrier. Вақте ки амалиёти бо флаги .barrier дар навбат гузошта мешавад, он интизор мешавад, ки ҳамаи амалиёти қаблӣ ба анҷом расанд, пас худ иҷро мешавад, ва дар вақти иҷрои он, дигар амалиётҳо (ҳамаи хондан ва навиштан) иҷро намешаванд. Пас аз анҷоми амалиёти бариер, навбат боз рақобатӣ мешавад. Ин маънои онро дорад, ки хондан параллелӣ аст, навиштан — истисноӣ.

    let readWriteQueue = DispatchQueue(label: "com.example.readwrite", attributes: .concurrent)
    
    func readData() {
        readWriteQueue.async {
            // Логикаи хондани маълумот
            print("Маълумот хонда мешавад...")
        }
    }
    
    func writeData() {
        readWriteQueue.sync(flags: .barrier) {
            // Логикаи навиштани маълумот
            print("Маълумот навишта мешавад...")
        }
    }
    

    Ин код ҳамон кодест, ки барои навбатии сериалӣ, аммо хусусияти .concurrent навбатро рақобатӣ мекунад. Флаги .barrier навбатро ба рафтори секвенсиалӣ танҳо барои ин амалиёт табдил медиҳад.

  • os_unfair_lock (iOS 10+): Блокировкаи пастсуръат, нисбат ба NSLock самараноктар. Барои иҷрои логикаи мураккаби хонандагон/нависандагон дастӣ истифода мешавад, агар талаботи баландтарин иҷроиш ё рафтор махсус бошад. Истифода бо эҳтиёт.

Интихоби ҳалли мувофиқ ба талаботи мушаххаси барнома, басомади амалиётҳои хондан ва навиштан, ва сатҳи иҷроиш ниёз дорад. Дар аксар ҳолатҳо, истифодаи навбатии рақобатӣ бо флаги .barrier беҳтарин ва тавсияшуда дар iOS мебошад.