linux high performance message passing zwischen threads in c++
sagen, ich habe einen Prozess, der spawnt 2 threads
den ersten thread hört in einer engen Schleife für Päckchen Ereignisse auf einem UDP-port.
der zweite thread zum empfangen von bytes enthalten, die in das UDP-Paket und analysieren es/etwas tun.
kann jemand empfehlen, eine schnellere Methode als die Verwendung linux message queues?
ich denke, Sie sind langsam, weil Sie das kopieren der bytes, die beim schreiben in die Warteschlange aus, und kopieren Sie wieder nach dem Lesen aus der queue
ich bin mir bewusst, zeromq-Bibliothek, aber es ist eine glatte Art und Weise dies zu tun, ohne dass overhead?
ich merke, ich könnte nur über ein tcp/ip socket zwischen den beiden Gewinde für die einfache Kommunikation in der Warteschlange, aber gibt es einen schnelleren Weg?
ich bin am überlegen vielleicht einen ring-buffer im Speicher, der gemeinsam genutzt wird zwischen dem Gewinde und einem mutex verwendet, um zu Steuern einen Zeiger auf das zuletzt aktualisierte element?
anyones Gedanken hier?
- Ist das wirklich dein Flaschenhals? Warum nicht shared memory threads anstelle von Prozessen, wenn Sie wirklich begrenzt durch die übergabe, dass sich viele Dinge um.
- Was hast du sonst noch versucht? Unix-sockets? Die Rohre? SysV IPC?
- haben Sie einen Blick auf code.google.com/p/disruptor: es ist java, aber es kann Sie begeistern... 😉
- Sie denken, Sie sind langsam, aber die Langsamkeit ist relativ zu was auch immer sonst noch Los ist im Programm. sollten Sie kennen und in der Lage sein, diese Technik verwenden, um zu sehen, was Zeit kostet. Die chance ist gut, dass Sie einen größeren speedup Gelegenheit an anderer Stelle. Jedoch, vorausgesetzt, Sie tun, und Sie es zu beheben, dann könnte es sein, dass das, was Sie Fragen, ist eigentlich das größte Problem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist die effizienteste Methode, dass ich denken würde verwenden Sie eine verkettete Liste, ein mutex und eine bedingungsvariable:
Die Ihnen ein zero-copy-Kommunikation Mechanismus. Die Zeit, die holding der mutex ist minimal, so Streit sollte niedrig sein auch.
Wenn Sie wollte, zu optimieren, ein bisschen weiter, Sie haben könnte, thread B greifen alle Elemente aus der verketteten Liste auf einmal, statt nur knallen off ein zu einer Zeit-etwas, das möglich ist, in O(1) Zeit mit einer verlinkten Liste. Und dann haben thread Ein signal der condition variable nur, wenn die verknüpfte Liste leer war, kurz bevor es angefügt seine Letzte udp-Paket-Puffer-Objekt. Das würde reduzieren auf die Anzahl der Zeiten, die threads zu sperren/entsperren/signal, wenn unter der schweren Last.
Diese sehr gute Antwort war, was ich erwartet als gut, wenn Sie diese Seite
https://stackoverflow.com/a/8567548/2893944
Eine kleine Bemerkung, die Ihnen behilflich sein könnten: getting rid of dynamic memory allocations ist auch ein Punkt, das könnte die performance erhöhen und die Vermeidung der Fragmentierung des Speichers (ex: verwenden Sie eine statische array ist, verwenden Sie einen Speicher-pool).
(dies sollte ein Kommentar werden, aber nicht genügend Ruf für Sie, dass)
Kasse http://www.boost.org/libs/circular_buffer/
Ich benutze gefüllt mit boost::array<1500> als Kommunikation zwischen 2 threads in einem Projekt und ich kann nicht sehen, dass es langsam ist, in irgendeiner Weise. wo der thread ist erstmal zu akzeptieren UDP-Pakete, und schnell durch die Prüfung einiger bits, wenn es soll es in den Puffer. es tut kopieren in und aus, aber das ist nicht einmal zeigen, wenn ich Profil.
EDIT: die BoundedBuffer Beispiel ist das interessante bit, http://www.boost.org/libs/circular_buffer/doc/circular_buffer.html#boundedbuffer
Für die maximale Leistung, die Sie wollen eine Feste Größe, lockess, single-writer, single-reader queue.
Dieser codeproject Artikel drehte sich in einer schnellen google-scheint vernünftig und erklärt einige der ins und outs.
Ich habe keine Ahnung, was Ihre Nutzung Fall ist - aber wenn so einer langen Maßnahme getroffen wird, - Sie Ihre software (und Umgebung) muss überlegen, wie mit der situation umzugehen, in denen eine volle Warteschlange verursacht durch eine langsame Verbraucher verursachen dataloss.