簡體   English   中英

線程安全處理

[英]Thread safe processing

我有一種算法可以識別照片中的對象。 主要問題是它不是線程安全的,因此,例如,當您設置新配置或在仍在處理差異一個時開始處理新映像時,該算法的行為是不確定的,並且可能會崩潰。 下面,我放上我的代碼和實現不佳的實現。

// config struct
public struct Config {} 

// reslut of the algorithm
public struct Product {}  

// algorith class
public class Recognizer { 
   func apply(config: Config)
   func process(frame: UIImage) -> Product {
       let prodcut = Product()
       return prodcut
   } 
}

// protocol for an object interested in the result of the Recognizer
protocol Observer: class {
    func didProcess(frame: UIImage, prodcut: Prodcut) 
}

// protocol that wraps Recognizer class
protocol RecognizerService {
    func add(observer: Observer)
    func remove(observer: Observer)
    var recognitionConfig: Config { get set }
    func process(frame: UIImage)
}

下面是現在的樣子。

let recognizerQueue: DispatchQueue = DispatchQueue.global(qos: .background)

class HumanFaceRecognizer: RecognizerService {
      var recognitionConfig: Config
      var observers: [Observer]
      let algorythm: Recognizer
      private var recognizerQueue: DispatchQueue

      init(recognitionConfig: Config,
           observers: [Observer] = [],
           recognizerQueue: DispatchQueue,
           algorythm: Recognizer) {
           self.recognitionConfig = recognitionConfig
           self.observers = observers
           self.recognizerQueue = recognizerQueue
           self.algorythm = algorythm
      }

      func add(observer: Observer) {
          observers.append(observer)
      } 

      func remove(observer: Observer) {
          observers.remove(observer)
      }

      func process(frame: UIImage) {
          recognizerQueue.async { [weak self, currentFrame = frame, currentConfig = recognitionConfig] in
          self?.algorythm.process(frame: currentFrame)
          observers.forEach { $0.didProcess(frame: currentFrame, result: currentConfig) }
      }
}

我認為將計算分配到后台時做錯了,但是我找不到合適的解決方案。

我認為您提供的代碼不足以清楚地解決您的問題。 如果您發布了崩潰等的一些調用堆棧,將很有幫助。

首先想到的是:

  • 觀察者也許無法從任意線程(全局隊列)中調用,因為它們執行一些UI更新等。在這種情況下,您可以從主隊列中調用didProcess
  • 也許存在一個問題,即某些觀察者在HumanFaceRecognizer被調用時didProcess自己從HumanFaceRecognizerdidProcess ,即forEach調用可在修改后的集合上運行。 在這種情況下,應在遍歷之前復制observers數組。
  • 您也可以嘗試(深層)復制算法類,以使其“更多”線程安全

希望這有所幫助 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM