Multithreading für console



  • Hallo,

    Welche ist die beste Möglichkeit in ein Konsolenprojekt Multithreading einzubauen? Habe gelesen dass es wohl verschiedene Möglichkeiten gibt aber konkrete Infos bekommt man nicht zu richtig.

    Also die winAPI ist so oder so eingebunden also kann problemlos benutzt werden.



  • Nimm Boost::Thread. Dann verlierst du auch nicht die plattformunabhängigkeit.



  • Plattformabhängig bin ich durch Verwendung der WinAPI so oder so. Da ich mich bisher auch noch nie in Boost eingearbeitet habe, würde ich es gerne ersteinmal vernachlässigen, es sei denn mir wird gesagt dass Boost neben der Unabhängigkeit noch andere Vorteile hat.



  • Snaper schrieb:

    Welche ist die beste Möglichkeit

    Nach welchen Maßstäben? Was bedeutet für dich "beste" in diesem Kontext?

    Snaper schrieb:

    in ein Konsolenprojekt Multithreading einzubauen? Habe gelesen dass es wohl verschiedene Möglichkeiten gibt aber konkrete Infos bekommt man nicht zu richtig.

    Was ist Dein Ziel? Soll es eine protable Konsolenanwendung werden? Willst Du das Ding nur unter Windows zum Laufen bekommen?

    Ich arbeite zZ mit Boost.Thread und kann meine Berechnungen sowohl auf meinem Bürorechner (WinXP) als auch auf unserem Linux Cluster laufen lassen. Abstraktion ist schon was tolles.



  • Es ist im Grunde nichts wildes.

    Punktberechnung,Winkel errechnen und dabei auf ne eingabe warten. Ggf. werde ich mal in Boost einarbeiten bzw. weiß ich nicht inwieweit man sich da einarbeiten muss.



  • Als Alternative seien mal die Threads von SFML aufgeführt. Am besten schaust du dir beides an und entscheidest dich für die Möglichkeit, die besser passt.



  • wie stehts denn mit _beginthread der process.h?



  • Okay,

    habe jetzt Boost benutzt. Klappt soweit auch ganz gut. Jedoch habe ich ein paar Methoden die ich als Threads ausführen muss. Nun besteht ja die Möglichkeit das per Boost::bind zu realisieren. Nun mein problem. Es ist ein wenig ätzend, dass ich für jede Methode einen Thread erstellen muss. Bzw. auch wenn ich eine Methode in 2 Objekten aufrufe muss ich ja beiden "threaden". Also gibt es eine Möglichkeit den thread beim methodenaufruf zu erstellen? Also quasi dynamisch?



  • Oder mal OpenMP angucken!



  • Snaper schrieb:

    Es ist ein wenig ätzend, dass ich für jede Methode einen Thread erstellen muss. Bzw. auch wenn ich eine Methode in 2 Objekten aufrufe muss ich ja beiden "threaden". Also gibt es eine Möglichkeit den thread beim methodenaufruf zu erstellen? Also quasi dynamisch?

    Es gibt Leute die froh sind dass man mit boost::thread (und bald auch mit std::thread) frei ist und jede Methode in einem neuen Thread starten kann und nicht nur den Weg über Ableiten von einer Thread-Basisklasse und implementieren eine virtuellen run()-Methode (so wie das wohl in Java ist) gehen muss.

    Du kannst im Prinzip beliebig neue Methoden deiner Klasse hinzufügen, in denen du eine Membermethode in einem neuen Thread startest.



  • Denke mal dass du das in etwa so meinst:

    class bla
    {
     methode1(){cout << "foobar"}
     methode1Wrapper();
    }
    
    methode1Wrapper()
    {
     boost::thread t1(boost::bind(&bla::methode1,&this));
     t1.join();
    }
    

    Nur dann problematisch wenn im Thread ne endlosschleife ist zwecks Keyabfrage. Denn dann würde der ja vorerst nachfolgende Threads nicht joinen?!


Log in to reply