Threads



  • Hi,
    Danke für deine Antwort werde mir das mal anschauen mit den libs.

    The-Kenny schrieb:

    PS: iostream.h ist veraltet 😉
    Nutz lieber iostream + using namespace std; oder schreib vor die Funktionen aus iostream std::

    Ich weiß 😉
    War ja nur ein Bsp. Code 🙄

    MFG ReduX



  • @1: Solange die beteiligten Threads nicht auf gemeinsame Daten zugreifen wollen, erübrigt sich die Synchronisation. Erst wenn du ein Objekt hast, das beide verwenden wollen (z.B. cout in deinem Beispielcode), mußt du dir darüber Gedanken machen).

    @2: Threads von außen abzuschießen IST böse - auf die Weise nimmst du ihm die Chance, hinter sich aufzuräumen. Besser ist es, dem Thread von außen zu sagen, daß er jetzt Feierabend machen soll - und dann zu warten, bis er sich beendet hat.
    (btw wird dein Hauptprogramm auch endlos weiterlaufen ;))



  • Hallo ReduX,

    Wie The-Kenny schon sagte würde auch ich hier auf jeden Fall den Einsatz der boost.thread Library empfehlen. Eine "boost"-Version Deines Programms würde etwa so aussehen.

    #include <iostream>
    #include <string>
    #include <boost/thread/thread.hpp>
    #include <boost/bind.hpp>  // Zl.4
    #include <Windows.h>        // Sleep
    
    void function( const std::string& txt, int cnt ) // Zl.7
    {
        using namespace std;
        for( ; cnt; --cnt )
        {
            Sleep(300);
            cout << txt << endl; // Zl.13
        }
    }
    int main()
    {
        boost::thread thrd( boost::bind( &function, "thread", 20 ) );
        function( "ABC", 20 );
        thrd.join();
        return 0;
    }
    

    inklusive sauberen Beenden des Programms.

    Wenn Du jetzt vor den Zeilen 4, 7 und 13 noch folgendes einfügst:

    #include <boost/thread/mutex.hpp> // 4
    boost::mutex io_guard; // 7
            boost::mutex::scoped_lock lock( io_guard ); // 13; hinter Sleep!
    

    so werden die Ausgaben auch nicht mehr vermischt.

    Ab boost 1.34 ist die Installation von boost auch wesentlich besser erklärt.

    Bem.: dieses Programm sollte so auch unter Linux laufen, wenn man das #include <Windows.h> ersetzt, versteht sich von selbst ...

    Gruß
    Werner



  • Eine andere Möglichkeit die mir eben eingefallen ist, sind die asynchronen Timer von boost.asio, dann wärst du vollkommen Plattform-unabhängig.

    http://asio.sourceforge.net/boost_asio_0_3_7/libs/asio/doc/tutorial/tuttimer3.html



  • Hi,
    Ne Frage zu boost.
    Ich möchte Code::Blocks verwenden.
    Kann ich dann trozdem den installer von Boost Consulting nehmen?
    Weil wenn ich die sourcen selber compilen muss, da steig ich nicht so ganz durch!

    MFG ReduX



  • ReduX schrieb:

    Ich möchte Code::Blocks verwenden.
    Kann ich dann trozdem den installer von Boost Consulting nehmen?

    Sollte IMHO eigentlich nicht möglich sein (unterschiedliche Compiler => Unterschiedliches Binärformat).

    cu André



  • Naja, was haste denn für einen Compiler in COdeblocks? Benutzt du den MS-Compiler?

    Aber ganz ehrlich: so schwer ist das nicht! Die Anleitung ist zwar lang, aber da ist viel bla bla mit drin. Und die Eigentliche Arbeit sind nur ein paar Handgriffe. Ich würde es wenigstens nach der Anleitung probieren. Einfach nur probieren...



  • Sehe ich auch so, im Grunde ist es bei Code::Blocks mit Mingw ein einziger Befehl, etwas warten und danach ein paar Dateien verschieben.



  • Hi,
    Habe es nun mit boost geschaft, die Installation war wirklich einfach (hätte ich nicht gedacht).
    Hab da noch ein paar Fragen:
    1.) Wenn ich nun Threads einbaue benötige ich später eine .dll von boost, doch der name "boost_thread-mgw34-mt-1_34_1.dll" ist mir zu lang ich würde gerne das die Datei "thread.dll" heißt, wie mache ich das?.
    2.) Was bedeutet beim Bsp. Code am schluss das thrd.join(); ? Beendet es den Thread? Oder besser gibt es eine gute Doku für boost?
    3.) Was bringt mir boost außer Threads sonst noch, als ich im boost verzeichnis rumgeschaut habe sind mir sachen wie iostreams etc. aufgefallen, dass sind aber sachen die bei C++ standart sind!

    MFG ReduX



  • ReduX schrieb:

    1.) Wenn ich nun Threads einbaue benötige ich später eine .dll von boost, doch der name "boost_thread-mgw34-mt-1_34_1.dll" ist mir zu lang ich würde gerne das die Datei "thread.dll" heißt, wie mache ich das?.
    2.) Was bedeutet beim Bsp. Code am schluss das thrd.join(); ? Beendet es den Thread? Oder besser gibt es eine gute Doku für boost?
    3.) Was bringt mir boost außer Threads sonst noch, als ich im boost verzeichnis rumgeschaut habe sind mir sachen wie iostreams etc. aufgefallen, dass sind aber sachen die bei C++ stan**** sind!

    1. Du kannst bjam beim aufrufen noch ein Parameter mitgeben, dann benennt er die Dateien einfach libboost_.a und boost_.dll.
    2. Der Befehl thread.join() wartet so lange, bis der Thread fertig ist.
    3. boost.iostreams ist kein Ersatz für die normalen Ein- und Ausgabestreams, eine komplette Doku gibt es hier



  • 1.) Den Namen würde ich nicht unbedigt ändern. Hat den Sinn, das die ganzen Libs nämlich in einem Verzeichnis drin sind, und du mit mehreren Boost-Versionen arbeiten kannst. Gut, für das Deployment kann man natürlich den Namen ändern.
    2.) join tritt dem Thread bei und kehrt erst zurück, wenn der Thread beendet wird.
    3.) Was boost alles kann, steht in der Dokumentation. Boost ist seeeehr umfangreich, man braucht wahrscheinlich nicht mal die hälfte davon. 😉 Schau mal hier: http://de.wikipedia.org/wiki/Boost


Anmelden zum Antworten