Fondamentalement, j'ai multi-threads qui ajoute des données dans une file d'attente via SQLite. J'ai un autre thread qui les tire et les traite un à la fois (trop de ressources pour faire plusieurs à la fois). Le fil de traitement fait ceci:Comment gérer cette condition de course de file d'attente (db)?
- données DB tirer de
- foreach {} proccess
- si le nombre == 0 {Thread.Suspend()} (par s'éveiller thread.resume())
- répéter
mon thread de travail fait:
- données Valide
- insère dans DB
- appel Queue.Poke (QueueName)
Quand je touche du bout, si le fil est suspendu, je .resume()
il. Ce qui m'inquiète, c'est que si le fil de processus voit count==0
, mon ouvrier insère et pique alors mon processus continue dans le si et dort. Il ne réalisera pas qu'il y a quelque chose de nouveau dans la DB.
Comment dois-je écrire ceci de manière à ne pas avoir de condition de concurrence?
Je ne comprends pas event.Reset, quel event.Wait peut être (sonne comme si je n'utilise pas la classe de thread) et event.set hmm, si cela ne course pas alors event.wait ne bloque pas sauf si l'événement est réinitialisé et effacer ... intéressant. Quelle classe est-ce que j'utilise? –
événement est une instance ManualResetEvent deux thread ont une référence à. La partie clé est l'ordre: traitement d'abord Reset, puis dequeue et la première mise en file d'attente du worker puis Set.Cela garantit qu'il n'y a pas de fenêtre lorsque le traitement passe en veille et qu'il manque un élément mis en file d'attente. –
Excellente réponse. –