PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Threadsafe C++ stdlib



RapidMax
07-10-2003, 20:12
Hallo

Wie sieht das nun aus mit der Thread-Sicherheit und C++. Sowohl bei der Suche im Netz als auch hier im Forum ist mir nicht ganz klar geworden, wie das nun ist und auf was ich achten muss.

Hier wird auf das Thema eingegangen:
http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/howto.html

Und hier ebenfalls:
http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_6

Ich habe vor: Verwendung von pthreads. Die Threads kommunizieren nur über Fifo's, bei welchen es sich im Wesentlichen um einen Wrapper handelt, der eine list<Message> über Mutex vor gemeinsamen Zugriff schützt. Innerhalb der Threads verwende ich natürlich auch strings, vectors etc. aus der stdlib, aber nicht über die Thread-Grenze hinweg.

Vorerst soll das Ziel sein, es auf einem System mit g++ (gcc) > 3 (aktuell 3.3.1) zum laufen zu bringen. Dieser linkt ja gegen die stdlibc++-v3.

Was mir jetzt nicht ganz klar ist:
- verwenden nun Die Standard-Container (und strings) einen gemeinsammen Allocator-Pool, der nicht thread-safe ist? (Wenn ja, wie umgehe ich das?)
- Die glibc ist, wie ich gesehen habe, threadsafe, also kann ich ohne weiteren Massnahmen z.B. nach stdout (cout) schreiben?
- wo gibt es sonst noch Probleme mit der Stdlib, auf die ich achten muss?

Hat jemand bereits damit Erfahrungen gesammelt, und kann mir ein paar Tips, oder Literatur dazu geben?

Gruss, Andy

Anmerkung: g++ sagt mit, dass er das Thread-Model posix verwendet und mit -dumpspecs liefert er u.a.: %{pthread:-D_REENTRANT}%{pthread:-lpthread} -> müsste also threadsafe sein?

RapidMax
11-10-2003, 14:33
Ok, die STL scheint threadsafe zu sein. Bis jetzt läuft es. Mich hat nur verwirrt, dass nach einem Segmentation Fault beim Backtrace was von Allocator angezeigt wurde. Der Fehler liess sich allerdings auf was anderes zurückführen.

Ich hoffe im Belastungstest passiert nicht doch noch was....

Gruss, Andy

anda_skoa
11-10-2003, 15:08
Ich glaube std::string ist nicht threadsafe!
Die Klasse benutzt AFAIK Copy-on-Write und benutzt implizites sharing.

Kann aber sein, dass meine Infos da nicht akutell sind.

Ciao,
_

RapidMax
11-10-2003, 16:39
Das würde meine bisherigen Erkenntnisse bestätigen: In dem Stack, den ich benutze, machen sie regen Gebrauch von den STL-Container, einzig ein std::string ist nirgends zu finden, dafür haben sie ein eigene Implementation geschrieben.

Allerdings ist der Stack recht portabel, so dass es auch sein kann, dass die STL-Implementation, die ich verwende thread-safe ist, aber andere nicht. (Wird auch in den oben erwähnten Links erwähnt).

Nun, dann suche ich mir einen Ersatz, oder schreibe es selber... Kennt jemand einen Ersatz?

Danke und Gruss
Andy

anda_skoa
11-10-2003, 18:16
Du könntest schaun, ob eventuell die Boost Library entsprechende threadsafe Klassen hat.
www.boost.org

Ciao,
_

RapidMax
11-10-2003, 23:06
Aber dann habe ich noch ein Abhängigkeit. Ich dachte eher an eine einfache Implementation einer String-Klasse (I/O-Operatoren und grundlegende String-Verarbeitungs-Operatoren). Unter der GPL-Lizenz, mehr ein Code-Schnippsel als eine Library.

Naja, das bringe ich selber noch hin.

Gruss, Andy

anda_skoa
11-10-2003, 23:13
Du könntest in der TinyQ nachsehen.
Das sind ein paar essentielle Qt Klassen unter GPL in einer kleinen Lib
Unter anderem QString, QCString

Ciao,
_

RapidMax
12-10-2003, 13:13
Ok, Danke vielmals :)

Gruss, Andy