tutorial zu programmierung mit threads



  • hi!
    probiers mit boost::threads
    Boost is an organization started by members of the C++ Standards Committee Library Working Group to develop new source libraries for C++

    http://www.boost.org/libs/thread/doc/

    tutorial:
    http://www.cuj.com/documents/s=8470/cuj0205kempf/

    sample:

    #include <boost/thread/thread.hpp> 
    #include <iostream> 
    
    void MessageSend() 
    { 
            std::string message; 
    
        while(1) 
        { 
                    message = ""; 
    
            do{ 
                std::getline(std::cin, message); 
            }while(message.empty()); 
    
            std::cout << "Thread MessageSend started! Message: " << message << std::endl; 
        } 
    } 
    
    void MessageReceive() 
    { 
        while(1) 
        { 
            std::cout << "Thread MessageReceive started" << std::endl; 
        } 
    } 
    
    int main() 
    { 
    
        boost::thread thrd1(&MessageSend); 
        boost::thread thrd2(&MessageReceive); 
        thrd1.join(); 
        thrd2.join(); 
    
            std::cin.get(); 
            return 0; 
    }
    

    cu..ich hoff das reicht dir!



  • Da Threads OS abhängig sind, könnte es mit einer Lib für beide Systeme (Windows, Linux) schlecht aussehen.



  • danke surf, da bleib ich mal dran 🙂

    hi luckie! bist du der luckie aus der DP? 😃

    native threads für win reichen mir anfangs schon. wenn ich dann mit ifdef arbeiten muss und doppelt code schreiben darf, auch nicht so schlimm.

    thx



  • Luckie schrieb:

    Da Threads OS abhängig sind, könnte es mit einer Lib für beide Systeme (Windows, Linux) schlecht aussehen.

    genau dann nimmt man ja boost! boost thread sind system unabhängig!

    cu



  • Naja,letztendlich hast du damit aber doch keinerlei Einfluss auf das Scheduling von Windows.Dein "Prozess"(eigentlich der primäre OS-Thread!) bekommt seine Zeitscheibe zugeteilt und wenn er die intern auf 50 "Threads" aufteilt interessiert das Windows nicht die Bohne.Ob sich damit grossartige Performancegewinne erzielen lassen?

    MfG Spacelord



  • Spacelord schrieb:

    Naja,letztendlich hast du damit aber doch keinerlei Einfluss auf das Scheduling von Windows.Dein "Prozess"(eigentlich der primäre OS-Thread!) bekommt seine Zeitscheibe zugeteilt und wenn er die intern auf 50 "Threads" aufteilt interessiert das Windows nicht die Bohne.Ob sich damit grossartige Performancegewinne erzielen lassen?

    MfG Spacelord

    Wenn ich dich jetzt richtig verstanden habe, dann hast du den Sinn der Threads falsch verstanden.
    Nen Thread verwendet man um Arbeiten parallel auszuführen (z.B. ne Berechnung im Hintergrund und ne GUI im Vordergrund), die sich sonst gegenseitig blockieren würden.

    Wenn man nen weiteren Prozess braucht, muss man natürlich nen Prozess starten und keinen Thread (nen Prozess enthält ein oder mehrere Threads).



  • Spacelord schrieb:

    Naja,letztendlich hast du damit aber doch keinerlei Einfluss auf das Scheduling von Windows.Dein "Prozess"(eigentlich der primäre OS-Thread!) bekommt seine Zeitscheibe zugeteilt und wenn er die intern auf 50 "Threads" aufteilt interessiert das Windows nicht die Bohne.

    IIRC würde das nur dann zutreffen, wenn Windows-Programme ihre Threads selbst simulieren müssten, und zwar ohne Kernelunterstützung.
    Da Windows aber Threads anbietet, weiß es natürlich davon. Windows gibt den einzelnen Threads Rechenzeit, nicht dem Prozess.



  • Da hab ich mich wohl unglücklich ausgedrückt.
    Wenn ich boost Threads benutze hat dass doch keinerlei Einfluss auf Windows!
    Wenn ich mit WinApi-Funktionen in einem Prozess mehrere Threads erstelle bekommt jeder dieser Threads vom OS früher oder später Rechenzeit zugeteilt.Wenn ich aber im primären OS Thread,diese boost Pseudo Threads benutze bekommt dennoch nur der primäre OS Thread Rechenzeit und die Pseudothreads müssen diese unter sich aufteilen.

    MfG Spacelord



  • Das sind keine Pseudothreads, das ist nur ne Wrapper-Klasse um die Threads der einzelnen Systeme.



  • Ach so,
    dann ist das was anderes.Ich war davon ausgegangen dass die boost Threads keine "echten" Kernel Threads erstellen.

    MfG Spacelord



  • gut zu wissen...

    hab noch das hier gefunden, scheint ganz brauchbar:
    http://www.linuxjournal.com/article.php?sid=3184



  • da boost.threads leider noch nicht so einen großen funktionsumfang hat (wie auf den seiten auch zugegeben wird), poste ich mal die relevanten links für winapi threads:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/multiple_threads.asp
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_threads.asp



  • Wen du etwas ausführliches suchst kann ich dir nachfolgendes Buch empfehlen:
    http://www.amazon.de/exec/obidos/ASIN/0201442345/qid=1097939260/br=3-1/br_lfncs__1/028-1363784-9752568
    Ist zwar etwas älter stimmt inhaltlich aber immer noch, da sich die Konzept
    seit NT nicht wesentlich geändert haben.

    Hi c.rackwitz,
    den Link auf "creating threads" finde ich zweischneidig weil in den meisten
    Fällen, wenn dein Programm nämlich das C-Laufzeitsystem benötigt, die Verwendung
    von CreateThread() zu Fehlern führt.

    mfg JJ



  • was meinst du mit "C-Laufzeitsystem" und welche fehler können da auftreten?



  • hallo,

    ganz einfach. Wenn Du in Deiner Threadfunktion z.B. strlen() verwendest, darfst Du nicht mit CreateThread arbeiten, sondern MUST _beginthread[ex] verwenden. Wenn Du hingegen in Deinem Thread nur ein WINAPI-Funktionen verwendest reicht CreateThread aus.

    Wie das jetzt im einzelen zusammenhängt, wage ich nicht zu nennen, aber z.B.
    kannst Du

    row = strtok(pString, '\r\n');
    while(row) {
    ...
    row=strtok(NULL, '\r\n');
    }

    verwenden. strtok ist aber nicht Threadsave, pString muß in der C-Runtime global gespeichert, sonst würde der Aufruf in der Schleife nicht funktionieren mit NULL.

    und diese globale variable in der pString gespeichert ist ist nicht durch eine CriticalSection geschützt.

    Wenn Du obige schleife in 2 Threads einsetzt, ist das Ergebniss der Schleifen
    nicht definiert so zu sagen.

    Außerdem muß auch die MultiThread-Version der C-Runtime gelinkt werden, und diese Stellt ebend _beginthread[ex] zur Vefügung.

    strtok_r ist wohl die Mutithread-Version von strtok.

    Evtl. ruft ja _beginthread[ex] später auch CreatThread auf, aber erstmal kann die C-Runtime "initalisiert" werden.

    MfG
    RB



  • RED-BARON hat das "bekannteste" Beispiel angeführt, strtok() wird im allgemeinen
    mehrfach hintereinander aufgerufen und da die Funktion nicht threadsafe ist geht
    der "Merker" verloren. Auch die Variable errno, in der Fehler abgespeichert
    werden, funktioniert nicht und einiges andere wohl auch nicht mehr. 😞
    In dem angegebenen Buch oder auch bei Jeffrey Richter wird genaueres erklärt. 🙂

    mfg JJ



  • was du mit c-runtime konkret meinst, hab ich immer noch nicht gelesen.
    mit den ganzen mutexes und critical sections und was es noch gibt, will ich nicht einsteigen.
    kennst du ein tutorial, mit dem ich in die win32 threading programmierung einsteigen kann? also z.b. 2 gleiche threads starten, die 1000 mal "." oder "|" in die konsole schreiben. sowas ist anschaulich und erschlägt einen nicht gleich.

    ich compiliere übrigens mit g++, nicht mit vc++ oder builder.



  • Das Laufzeitsystem steckt bei VC in msvcrt.dll, Laufzeitsysteme existieren jedoch für jeden Compiler. Weil das Laufzeitsystem all jene Funktionen enthält die der C-Standard vorschreibt (strtok(),...) und daher OS-unabhängig mit jedem Compiler mitgeliefert werden (müssen).
    Es fällt mir schwer dich zu entäuschen, auch wenn man mit "wenigen" Zeilen eine Thread erstellen und starten kann, so ist doch sowohl die richtige Verwendung(!!) als auch Implementierung von multithreaded Anwendungen keine leichte Übung.

    mfg JJ



    war mir klar, dass vc++ ne runtime braucht. hab ich schon öfters in fehlermeldungen gesehen. die gcc verwendet keine solche runtimes.

    is mir klar, dass threading was komplexes ist. allerdings will ich nicht in kapitel 1 von mutexes hören. ich will mit den grundlagen anfangen.

    hast du ein tutorial? für ein buch hab ich kein geld. ich finde auch nicht, dass mir als schüler das erlernen von winapi threading die 50 euro für ein buch wert sein muss.

    gruß



  • Wie das mit gcc heisst weiss ich nicht, er hat garantiert was ähnliches. Auch mit VC kannst du das Laufzeitsystem statisch dazu Linken, dann ist das ganze auch "Unsichtbar".
    Ein gutes Tutorial kennn ich leider nicht. Aber wenn sich jemand wie du in den "Tiefen" des Internet auskennt, dann lass dir sagen, man findet dort sogar das ein oder andere Fachbuch zum Download. 😉

    mfg JJ


Anmelden zum Antworten