8 Stimmen

Boost Message Queue basiert nicht auf POSIX Message Queue? Unmöglich zu wählen(2)?

Ich dachte, ich würde Boost.Interprocess's Nachrichten-Warteschlange anstelle von Sockets für die Kommunikation innerhalb eines Hosts. Aber nachdem ich nachgeforscht habe, scheint es, dass diese Bibliothek aus irgendeinem Grund die POSIX-Nachrichtenwarteschlangenfunktion (die mein Linux-System unterstützt) umgeht und stattdessen auf der Grundlage von POSIX Shared Memory implementiert ist. Die Schnittstelle ist so ähnlich, dass man das vielleicht nicht sofort vermutet, aber es scheint der Fall zu sein.

Der Nachteil für mich ist, dass gemeinsamer Speicher, der über shm_open(3) scheint nicht verwendbar zu sein mit select(2) im Gegensatz zu POSIX-Nachrichtenwarteschlangen, die über mq_open(3) .

Es scheint, dass die Boost-Bibliothek in diesem Fall verliert. Weiß jemand, warum das so sein sollte? Selbst wenn POSIX-Nachrichtenwarteschlangen nur auf einigen Systemen verfügbar sind, würde ich erwarten, dass Boost diese Möglichkeit nutzt, wo sie verfügbar ist, und sie nur bei Bedarf neu implementiert. Gibt es einen Fallstrick des POSIX-Systems, den ich noch nicht kenne?

4voto

jkp Punkte 74580

Ich bin neulich bei der Verwendung der Boost.Interprocess-Synchronisationsklassen auf eine ähnliche Situation gestoßen, nämlich die Condition-Klasse. Sie ist auf "generische" Weise implementiert, aber die Art und Weise, wie es gemacht wurde, ist die Verwendung eines benutzerdefinierten Spinlocks, der sehr ineffizient (zumindest unter OS X). Im Grunde genommen wurden die Sync-Klassen dadurch nutzlos.

Meiner Erfahrung nach ist die Interprocess-Bibliothek ziemlich unausgereift. Ich verwende sie für gemeinsam genutzten Speicher und sie funktioniert ziemlich gut, aber es gibt einige Ecken und Kanten und ich musste einige "fehlende Funktionen" wie die dynamische Größenanpassung des gemeinsam genutzten Speichers usw. umgehen.

Zusammenfassend kann man sagen, dass diese Bibliothek noch kein Allheilmittel ist. Sie ist gut, aber zur Zeit nicht außergewöhnlich.

0 Stimmen

Beachten Sie, dass unter Linux anstelle eines benutzerdefinierten Spinlocks pshared Mutexes und Zustandsvariablen verwendet werden, die fast so effizient sein sollten wie Mutexes innerhalb desselben Prozesses. Um jedoch die Auswahl auf boost::interprocess Objekten, müssen Sie einen Thread haben, der das betreffende Objekt überwacht und einen Fifo oder Eventfd anstößt, wenn Daten anstehen.

0 Stimmen

Immer noch keine Erklärung dafür, WARUM boost::interprocess nicht posix mqueue verwendet, wenn verfügbar... Ich habe selbst eine mqueue Abstration gemacht, dass wenn ich unter Win32 baue, meine Abstraktion boost::interprocess::mqueue verwendet und wenn ich unter Linux baue, meine Abstraktion posix mqueue verwendet. Das war einfach, deshalb kann ich keinen Grund finden, warum boost::interprocess nicht das gleiche tut. Unreife? Etwas, das ich übersehen habe?

2voto

zaufi Punkte 6244

Ja, leider ist das nicht der Fall. Ich war auch enttäuscht, als ich merkte, dass nach dem Graben von Quellen.

Aber hier ist die andere (gute) Seite dieser Tatsache: Wenn Ihr Programm boost::asio können Sie die POSIX-Nachrichtenwarteschlangen-API als nur eine weitere Datagramm Datenquelle und das wäre (IMHO) noch besser, wenn es ein Teil von boost::interprocess ... es wäre ziemlich nicht trivial, aber (IMHO) definitiv verdient, so können Sie mit MQ in einer einheitlichen Weise arbeiten und verwenden Macht von anderen boost::asio Zeug...

... wenn ich bei meinem nächsten Projekt wieder POSIX MQ benötige, werde ich auf jeden Fall diesen Weg wählen :)

0 Stimmen

Ich hatte die gleiche Idee über die Verwendung von boost::asio für Message Queue, genau wie Sie vorschlagen, als nur ein weiteres Datagramm Quelle. Haben Sie Erfahrungen mit dem Hinzufügen einer Datagrammquelle zu boost::asio gemacht? Ich habe kaum an der Oberfläche des Themas gekratzt, indem ich einige Quelltexte von boost gelesen habe, aber ich habe noch keine gute Dokumentation/Tutorial zu diesem Thema gefunden...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X