bin ich hier mit Fragen zu den Boost-Bibliotheken richtig? Ich verwende
die gerade massiv, um Programme systemunabhᅵngig zu machen und da
stellen sich mir doch einige Rᅵtsel.
Aktuell geht es um boost::interprocess::named_mutex.timed_lock(const
boost::posix_time::ptime& abs_time) - ich finde hier keinen Konstruktor,
mit dem ich diese Funktion aufrufen kann. Zu boost::posix_time::ptime
finde ich nur Konstruktoren fᅵr einen Zeitpunkt, den Aufruf eines Mutex
versucht man normalerweise aber fᅵr eine Anzahl Millisekunden und nicht
z.B. bis Heilig Abend 18:00 Uhr.
Was habe ich hier ᅵbersehen oder nicht verstanden?
Gruᅵ,
Ed
> bin ich hier mit Fragen zu den Boost-Bibliotheken richtig?
Ich glaube, das wurde mal so beschlossen. Ansonsten sehe /ich/ das
sowieso eher locker.
> Ich verwende
> die gerade massiv, um Programme systemunabhängig zu machen und da
> stellen sich mir doch einige Rätsel.
>
> Aktuell geht es um boost::interprocess::named_mutex.timed_lock(const
> boost::posix_time::ptime& abs_time) - ich finde hier keinen Konstruktor,
> mit dem ich diese Funktion aufrufen kann. Zu boost::posix_time::ptime
> finde ich nur Konstruktoren für einen Zeitpunkt, den Aufruf eines Mutex
> versucht man normalerweise aber für eine Anzahl Millisekunden und nicht
> z.B. bis Heilig Abend 18:00 Uhr.
Vorneweg: Ich kenne die Sachen nur vom Wegsehen, vermute aber,
Ausgangspunkt war eine spezielle Implementierung um etwas wie `select`
und Pipes oder Sockets herum und das Problem von "spurious wakeups",
verbunden mit dem Problem des (theoretisch) immer ungenauer werdenden
Timeouts bei folgenden Wiederaufrufen. Da bei Boost an solchen Stellen
oft Elfenbeinturm-Design betrieben wird, hat man beschlossen, dass nur
die Angabe eines absoluten Zeitpunkts RICHTIG[tm] ist, weil man den
Timeout ja eh jedesmal neu berechnet. Kann gut sein, dass man dann in
Folge den C'tor mit relativem Timeout weggelassen hat, weil das nur
unnütze User-Convenience ist und höchstens auf exotischen Systemen wie
Microsoft-Windows einen Vorteil böte.
Ich würde mich eher fragen, wenn ich "Programme systemunabhängig ...
machen" wollte, ob ich "named_mutex" für IPC(!) in Applikations-Code
haben wollte, oder doch lieber auf einem viel höheren Niveau abstrahiere
(Message-Queue o.ä.)
Ups, wo ist das Problem bei Boost? Ich dachte, dass diese Bibliotheken
in den C++-Standard eingehen, man zur Zeit eigentlich kaum
"zukunftssicherer" programmieren kann und habe aus dieser Gruppe noch
enthusiastische Empfehlungen in Erinnerung (jedenfalls vor ein paar
Jahren, hᅵtte vielleicht besser 'mal weiter mitgelesen ;o).
Beim Filesystem habe ich zuerst mit POSIX-Funktionen angefangen und bin
dann doch auf Boost umgeschwenkt, weil mir das insgesamt einfacher
erschien und auch einige exotische Sachen anbietet. Womit wᅵrdest Du
Software machen, die unter Linux und Windows compilieren soll (das ist
hier mit "systemunabhᅵngig machen" gemeint)?
Ein Boost-Socket, den ich mir zwischendurch gebastelt habe, hat mich
tatsᅵchlich nicht so ᅵberzeugt. Wie das funktionieren soll, wᅵre meine
nᅵchste Frage gewesen - damit lassen sich scheinbar nur ausgelastete
Verbindungen aufrecht erhalten, so bald der IO_Service.run() verlassen
wurde, scheint mir Schicht zu sein, thread hin und her. Das Beispiel
funktioniert, aber eine Verbindung aufnehmen und einfach nur aufrecht zu
erhalten, klappt gar nicht, dabei wᅵre dafᅵr ein IO_Service fast nicht
nᅵtig...
> Da bei Boost an solchen Stellen
> oft Elfenbeinturm-Design betrieben wird, hat man beschlossen, dass nur
> die Angabe eines absoluten Zeitpunkts RICHTIG[tm] ist, weil man den
> Timeout ja eh jedesmal neu berechnet. Kann gut sein, dass man dann in
> Folge den C'tor mit relativem Timeout weggelassen hat, weil das nur
> unnᅵtze User-Convenience ist und hᅵchstens auf exotischen Systemen wie
> Microsoft-Windows einen Vorteil bᅵte.
Ich bin inzwischen auf die Idee gekommen, dass es wahrscheinlich
irgendwo eine Funktion geben wird, die aus einer relativen Zeitangabe
ein ptime konstruiert. Bin aber noch nicht dazu gekommen, die zu suchen
und die Boost-Dokumentation ist in meinen Augen nicht gerade ein Muster
an ᅵberschaubarkeit. Man ist da scheinbar auf Geistesblitze angewiesen -
bei meinem Boost-Socket habe ich die Mᅵglichkeit des Bindens an
Elementfunktionen auch aus der Unmᅵglichkeit der Instanzenverwaltung
geschlossen, Motto "Das _*MUSS*_ doch irgendwie gehen!".
> Ich wᅵrde mich eher fragen, wenn ich "Programme systemunabhᅵngig ...
> machen" wollte, ob ich "named_mutex" fᅵr IPC(!) in Applikations-Code
> haben wollte, oder doch lieber auf einem viel hᅵheren Niveau abstrahiere
> (Message-Queue o.ᅵ.)
Ich brauche das zum einen, um den Start einer zweiten Instanz zu
verhindern (das geht natᅵrlich ohne Timeout) und zum anderen, damit ein
Programm, das sich selbst aufruft, auf das Ende der vorhergehenden
Instanz wartet (da wird der Timeout benᅵtigt). Ist eigentlich genau das,
wofᅵr ein named mutex auch gedacht ist...
> Ups, wo ist das Problem bei Boost? Ich dachte, dass diese Bibliotheken in
> den C++-Standard eingehen,
Kleine Teile von boost sind in die TR's zum neuen Standard eingegangen und
grᅵᅵtenteils angenommen worden.
Vorsicht! Boost ist eine (wie auch immer aufgebaute) Community, die alle
möglichen C++-Bibliotheken entwickelt. Hier ging es aber konkret um
einen bestimmten Ausschnitt.
> Ich dachte, dass diese Bibliotheken
> in den C++-Standard eingehen,
Da gibt es keinen direkten Zusammenhang.
> man zur Zeit eigentlich kaum
> "zukunftssicherer" programmieren kann und habe aus dieser Gruppe noch
> enthusiastische Empfehlungen in Erinnerung (jedenfalls vor ein paar
> Jahren, hätte vielleicht besser 'mal weiter mitgelesen ;o).
Es gibt eine ganze Reihe hochqualitativer Libs in Boost, bei denen man
sich einige Scheiben bezüglich guter Software-Architektur abschneiden
könnte, wenn man wollte. (Genau diese Details werden jedoch meist
ignoriert.)
> erschien und auch einige exotische Sachen anbietet. Womit würdest Du
> Software machen, die unter Linux und Windows compilieren soll (das ist
> hier mit "systemunabhängig machen" gemeint)?
Ich würde damit anfangen, die Schnittstellen zwischen Applikation und
System-Layer nach den Bedürfnissen meiner Applikation zu entwerfen und
erst dann zu schauen, wie ich's implementiere. Toolkits die die
Architektur der Applikation bestimmen, würde ich meiden. Die Idee, dass
irgendwelche Bibliotheken oder Toolkits den Pflegeaufwand einer
Applikation insgesamt verringern, hat sich nicht bestätigt.
> Ich bin inzwischen auf die Idee gekommen, dass es wahrscheinlich
> irgendwo eine Funktion geben wird, die aus einer relativen Zeitangabe
> ein ptime konstruiert.
Sicher: now() + timeout. (Funktionsnamen bei Bedarf anpassen.)
[named mutex]
> Ich brauche das zum einen, um den Start einer zweiten Instanz zu
> verhindern
Zweite Instanz pro /was/? Die Antwort auf diese Frage enthält die Lösung
des Programmierproblems. Meist ist es sowas wie "pro TCP-Port <x>" oder
"pro Config-File". Auf jeden Fall beeinhaltet die Lösung kein Mutex.
> (das geht natürlich ohne Timeout) und zum anderen, damit ein
> Programm, das sich selbst aufruft, auf das Ende der vorhergehenden
> Instanz wartet
Das ist vermutlich ein Designfehler. Wozu brauchst Du das?
Das ist mir etwas zu abstrakt - ich habe zwei Bibliotheksdateien, eine
os_fkt.h/.cpp mit Funktionen wie Copy_File(), Move_File(), Mk_Dir(),
etc., eine Fl_Fenster.h/.cpp mit Funkionen wie Fullscreen(),
Top_Window() und dann noch zwei Klassen t_mutex und t_thread. Sockets
und Serielle Schnittstelle laufen schon mit POSIX.
Wenn ich diese Sachen alle mit #ifdef "ᅵbersetzt" habe (da fehlt nicht
mehr viel, fᅵr das Fensterzeugs benutze ich direkt die Xlib), kann ich
so etwa 30 Projekte in einem Rutsch unter Linux compilieren. Ich
empfinde dieses Design als hinreichend zufriedenstellend.
Fᅵr mutex, threads und Filesystem habe ich BOOST vorgesehen, gibt es da
Einwᅵnde gegen Boost, die fᅵr eine POSIX-Lᅵsung sprechen? Wenn das mit
dem mutex ein vermurkster Teil von Boost ist, nehme ich eben POSIX -
dann hast Du mir den Tipp gegeben, bei allem, was bei BOOST
Schwierigkeiten macht, besser die Alternative zu nehmen.
Ich dachte eben nur, dass sich hier jemand damit auskennt.
>> Ich brauche das zum einen, um den Start einer zweiten Instanz zu
>> verhindern
>
> Zweite Instanz pro /was/?
Programminstanz pro PC.
>> (das geht natᅵrlich ohne Timeout) und zum anderen, damit ein
>> Programm, das sich selbst aufruft, auf das Ende der vorhergehenden
>> Instanz wartet
>
> Das ist vermutlich ein Designfehler. Wozu brauchst Du das?
Nein, das ist Absicht und funktioniert seit Jahren. Ich brauche das,
wenn ich das Programm in einem anderen Kontext neu starten will.