Container mit sicherem Zugriff
-
Hallo zusammen,
ich habe ein Problem und finde irgendwie keine lösung dafür. Ich hoffe Ihr könnt mir weiter helfen.
Ich habe mir eine Klasse gebaut die eine TCP/IP kommunikation abwickelt komplett mit boost async. Nun muss ich einen Resend Puffer einbauen der folgendermaßen funktionieren soll.
Momentan benutze ich eine map die einen key hat und eine struct als value.Wenn ich eine Nachricht vershicke die eine Aknowledge von der Gegenseite erwartet, schreibe ich diese mit ihre Sequenznummer als key in die Map. Bekomme ich das Ack zurück lösche ich diese wieder aus der map (in der Ack ist die Seq Nummer vorhanden).
Nun läuft alle x ms ein timer event das die map durchläuft und für jedes element nachsieht ob die das Ack schon so lange fehlt das die Nachricht erneut gesendet werden muss. Was pro Nachricht maximal 5 mal passieren soll, nach dem 5. Versuch wird die Nachricht auch aus der map entfernt. Wenn sie erneut gesendet werden muss wird sie gesendet und danach in der struct ein counter inkrementiert.
Daraus ergibt sich folgendes Problem :
Wenn Nachricht das erste mal gesendet wird -> Insert in die Map
Wenn Timer abgelaufen, jedes element wird überprüft ob es erneut gesendet werden muss (wenn ja sende) -> Inkrement des counters in der Map
wenn schon 5 mal gesendet -> delete in der Map
wenn Ack empfangen -> delete in der Mapdas sind paralelle Schreib lese Zugriffe auf die Map, und das kracht dann zeitweise.
Kann mir jemand helfen was ich benutzen kann, oder hat jemand einen Code (eine klasse mit der ich die Funktionen zum schreiben, und lesen Sicher machen kann)?
Vielen dank schon mal im voraus.
Gruss Sascha
-
Parallel = Threads? Weil das erwähnst du sonst nirgendswo. Die einfachste Möglichkeit ist einfach alle Zugriffe auf die map durch einen mutex abzusichern.
http://en.cppreference.com/w/cpp/thread
http://en.cppreference.com/w/cpp/thread/mutex
http://en.cppreference.com/w/cpp/thread/lock_guardDas ist halt relativ ineffizient, da muss man sich fragen ob Threads sich überhaupt lohnen. Andererseits hat man Threads ja nicht immer nur für Performance. Falls doch, dann wird das Ganze schon deutlich komplizierter, dann willst du vermutlich irgendeine Art Thread-Safe map aus boost oder so.
-
Hallo cooky451,
danke für die Antwort. Threads habe deswegen nicht erwähnt weil ich in der Klasse selber keine verwende, aber klar dadurch das ich boost async benutze und einen timer, ist es schon Threadding. Mit den mutex habe ich auch schon überlegt allerdings sollte/muss das ganze schnell sein, vielleicht kannst Du mir ja einen effektiven Weg des lockings für dieses scenario empfehlen, probiert habe ich es mit boost mutex, lock und unlock.
Gibt es eine Thread safe map in boost?
Gruss sascha
-
Bist du sicher, dass du threadsichere Container willst? Die lösen nämlich nicht so viele Probleme, wie sie versprechen. Sie können nur garantieren, dass einzelne Aufrufe nicht zu Race Conditions führen. Bei Message-Queues ist Threadsicherheit super-nützlich, aber manchmal willst du, dass eine Reihe von Aufrufen atomar geschieht (z.B. Iteration). Um das zu unterstützen, müssten Container spezielle Methoden anbieten.
Eventuell wäre TBB etwas für dich.
Übrigens: Wenn die Datenmenge in der Map nicht allzu gross ist, eine Seite nur lesen muss, und dies vergleichsweise selten nötig ist, kann es sich auch lohnen, sie zu kopieren und dann in aller Ruhe ungestört darin zu lesen.
-
Hi,
na ja ob ich die will oder nicht denke mal ich brauche sie. Die Datenmenge ist nicht so gross (im idealfall ein paar einträge). Nur ich weis nicht wie ich das sonnst lösen soll. Es sollte auch relativ schnell gehen, da es doch einige Nachrichten sein können die gesendet werden pro sekunde im lastbetrieb. TBB werde ich mir mal genauer ansehen habe ich schon ein paar mal gelesen.
Wie implementiert man denn so einen Puffer am besten?
Gruss Sascha