Variable de locking Swift 3 GCD et erreur block_and_release

J'utilise Swift 3 GCD pour effectuer certaines opérations dans mon code. Mais je reçois souvent une erreur _dispatch_call_block_and_release . Je suppose que la raison de cette erreur est que différents threads modifient la même variable, mais je ne suis pas sûr de savoir comment résoudre le problème. Voici mon code et mes explications:

J'ai une variable qui est accédée et modifiée dans différents threads:

var queueMsgSent: Dictionary<Date,BTCommand>? = nil func lock(obj: AnyObject, blk:() -> ()) { objc_sync_enter(obj) blk() objc_sync_exit(obj) } func addMsgSentToQueue(msg: BTCommands) { if queueMsgSent == nil { queueMsgSent = Dictionary.init() } let currentDate = Date() lock(obj: queueMsgSent as AnyObject) { queueMsgSent?.updateValue(msg, forKey: currentDate) } } func deleteMsgSentWithId(id: Int) { if queueMsgSent == nil { return } for (date, msg) in queueMsgSent! { if msg.isAck() == false && msg.getId()! == id { lock(obj: queueMsgSent as AnyObject) { queueMsgSent?.removeValue(forKey: date) } } } } func runSent() -> Void { while(true) { if queueMsgSent == nil { continue } for (date, msg) in queueMsgSent! { if msg.isSent() == false { mainSearchView?.btCom?.write(str: msg.getCommand()!) msg.setSent(val: true) lastMsgSent = Date() continue } if msg.isAck() == true { lock(obj: queueMsgSent as AnyObject) { queueMsgSent?.removeValue(forKey: date) } continue } } } } 

Je lance la méthode runSent comme:

  DispatchQueue.global().async(execute: runSent) 

J'ai besoin que runSent vérifie en permanence certaines conditions dans withinMsgSent, et les autres fonctions addMsgSentToQueueue et deleteMsgSentWithId sont appelées dans l'identifiant de thread principal nécessaire. J'utilise un mécanisme de locking mais il ne fonctionne pas correctement