Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Wie programmiert man "ThreadSafe"?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.08.2006, 17:02 Uhr
FunnyDingo



Hallo zusammen,

ich habe heute begonnen meine Applikation mit Threads (pthreads) auszustatten. Bisher funktioniert auch alles besten. Mich würde aber interessieren ob jemand von euch Erfahrung mit Thread-Programmierung hat. Wie kann ich feststellen ob eine meiner Funktionen (z.B. eine zum bearbeiten von Strings "not ThreadSafe" ist? Worauf sollte man achten? Was sollte man besser nicht tun?

Vielleicht kennt ja jemand von euch antworten auf diese Fragen oder eine gute Quelle in die man sich mal einarbeiten kann - das wäre wirklich hilfreich ;-)

Lieben Gruß aus Münster,
Funny
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 18.08.2006 um 17:02 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.08.2006, 17:21 Uhr
~Blubber2063
Gast


Also damit du Thread save wirst musst du dir überlegen was passiert wenn deine Methoden Funktionen von mehreren Threads "gleichzeitig" aufgerufen werden, d.h. solange du Daten hast die geschrieben werden musst du den lesenden Zugriff darauf verweigern. Das ganze gilt auch umgekehrt, dafür stehen dir bei Posix Threads die Mutexe und die Conditional Variablen zur Verfügung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.08.2006, 18:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wichtig ist aber auch sog. reentrant-funktionen zu benutzen. Beispiel: strdup, readdir, strtok benutzen internen speicher, wenn du diese in 2 threads gleichzeitig benutzt, kracht dir die anwendung um die ohren bzw macht nicht was sie soll das sich die puffer gegenseitig überschreiben, darum musst du halt z.b die _r-funktionen der jeweiligen benutzen. Das gleiche gilt natürlich für deine eigenen Funktionen: Zugriff auf globale Variablen muss serialisiert werden (gegenseitiger ausschluss, evtl über einen mutex oder meist reicht einfach nur ein lock aus) oder funktionen welche statische variablen enthalten, sowas möglichst vermeiden und lieber aus dem thread selbst den speicher übergeben.

Ist ein komplexes Thema, lernt man an der Uni
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.08.2006, 21:22 Uhr
FunnyDingo



Ui, ui, da habe ich mir ja was vorgenommen *g*. Wobei ich denke, dass ich schon einen guten Schritt geschafft habe.

Die "Hauptthread" initialisiert erstmal einen Netzwerk-Socket. Es folgen zwei Threads. Der eine wartet via poll auf Nachrichten und der andere sendet Daten. Die Kommunikation zwischen Haupthread<->Rec-Thread und Haupthread<->Send-Thread wurd über eine queue gemacht.

Für diese queue habe ich mir ein Klassen-Template angelegt.

C++:
template<class T> class ipc_queue {
    
    private:
        std::deque<T> datapool;
    
    public:
        ipc_queue();
        ~ipc_queue();
        void write(T);
        void read(T*);
};

Die Methoden write bzw. read werden die Daten halt in die deque schreiben und schützen mit Hilfe eines Mutex die queue (da die structs zum senden und empfangen unterschiedliche sind, habe ich mich hier für ein Klassen-Template entschieden).

Das ganz soll auch die Möglichkeit bieten, die Art de Kommunikation zu tauschen. Ich habe mir für die erzeugen der Threads eine Art Abstraktions-Layer geschrieben. Nun könnte ich diesen austauschen gegen ein Modul das nicht Threads sondern Prozesse erstellt und die aktuelle ipc_queue wird gegen eine getauscht, die mit SharedMemory umgehen kann. So kann man flexibel zwischen Thread/Mutex und Prozess/SHM wählen (wenn denn mal alles fertig wird *g*).

Aber danke schon mal für eure Tipps
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: