Boost.thread startet von allein?



  • Ich wollte mal ein bisschen multithreading machen...
    Schreibe also dieses Testprogramm:

    #include <boost/thread.hpp>
    #include <iostream>
    
    void thread1()
    {
    	for(unsigned i=0;i<400;++i)
    		std::cout<<"1";
    };
    
    void thread2()
    {
    	for(unsigned i=0;i<400;++i)
    		std::cout<<"2";
    };
    
    int main()
    {
    	boost::thread thrd1(thread1);
    	boost::thread thrd2(thread2);
    	return 0;
    };
    

    Hier sollte ja garnix passieren...
    Stattdessen wird aber thread1 ausgegeben -> wieso?



  • So wie ich das gelesen habe, wird der Thread bereits durch den Constructor aufgerufen, ich denke mal das nur Thread1 funktioniert, da nicht 2 Threads gleichzeitig auf cout zugreifen kann.
    Sollte ich mit meiner vermutung falsch liegen, bitte nicht schlagen, bin Anfänger (und Brillen träger).



  • ness schrieb:

    Hier sollte ja garnix passieren...

    Oft hilft es, wenn man einen kleinen Blick in die Dokumentation einer Bibliothek wirft.
    Konkret: http://www.boost.org/doc/html/thread.html

    Die sind sogar so nett und schreiben gleich was die "Effects" eines Aufrufs sind. Und in deinem Fall unterscheiden sich die "Effects" doch deutlich von "garnix".



  • Hm, ich dahte ich hab das falsch verstanden (jaja, ist eigentlich eindeutig...).
    Wie erzeuge ich threads die nicht automatisch gestartet werden? Ich hab nix dazu gefunden. Ich meine, dass ist doch der Sinn von threads: parallele Programmstränge. Aber wenn der thread ausgeführt wird und es erst dann weiter geht, wenn der thread fertig ist, was ist dann der Unterschied zu einer Funktion?



  • Du hast es schon richtig verstanden, keine Sorge. Nur hast du es halt falsch angewendet. Übergib doch einfach mal die Adresse der Funktion und nicht eine Kopie. So:

    boost::thread thrd1(&thread1);
    boost::thread thrd2(&thread2);
    
    // und jetzt starten:
    thrd1.join();
    thrd2.join();
    

    Schau einfach mal in die Beispiele rein, die im Boost-Verzeichnis drin liegen. Da kann man das auch sehr schön sehen.

    Achja, und beide Threads können problemlos "gleichzeitig" auf die Konsole was ausgeben.



  • Das nützt nix...
    Mein derzeitiges Beispiel:

    template<int k>
    void thread()
    {
    	for(unsigned i=0;i<400;++i)
    		std::cout<<k;
    };
    
    int main()
    {
    	boost::thread thrd1(&thread<1>);
    	boost::thread thrd2(&thread<2>);
    	boost::thread thrd3(&thread<3>);
    	boost::thread thrd4(&thread<4>);
    	boost::thread thrd5(&thread<5>);
    	boost::thread thrd6(&thread<6>);
    	return 0;
    };
    

    Die threads werden trotzdem einfach gestartet...
    /edit: und auch wenn ich alle threads nacheinander joine kommen die Ausgaben geregelt der Reihe nach...



  • thrd1.join()
    startet nicht den thread sondern wartet auf das ende dieses threads.

    wo ist das problem? erzeug das objekt doch erst dann, wenn der thread
    starten soll.

    die threads laufen "parallel". das stimmt nur, wenn du mehrere prozessoren
    hast. dann ist es moeglich, dass 2 threads parallel laufen koennen.

    auf einem system mit einem prozessor wechseln sich die threads immer nur ab.

    du kannst auch nichts ueber die reihenfolge sagen in der die threads an die
    reihe kommen. der kann theoretisch 400 mal "thread 1" ausgeben und dann
    erst "thread 2". oder bunt gemischt.



  • Mit parallel meinte ich abwechselnd, aber wenn ich das Programm jetzt ausführe, erscheinen die Zahlen geordnet, und das kann jan icht Sinn der Sache sein, oder?



  • Was ist eigentlich unsigned?

    Außerdem würde ich mal die for-Schleife vergrößern. 400 ist viel zu klein, das sich beide Threads abwechseln können. Bevor der zweite Thread dran kommt, ist die erste for-Schleife schon einmal komplett durchgelaufen. Mach mal 2000 oder für einen Test gleich mal 10000 draus. Dann wirst du auch sehen, das die sich abwechseln. Die cout-Ausgabe ist auf heutigen PCs einfach viel zu schnell...


  • Mod

    [quote="Artchi"]Übergib doch einfach mal die Adresse der Funktion und nicht eine Kopie.[/cpp]
    man kann funktionen nicht kopieren. ausserdem wird ein funktionsname implizit in einen zeiger auf die funktion umgewandelt.

    boost::thread thrd1(&thread1);
    boost::thread thrd1(thread1);
    

    das ist völlig equivalent. anders ist das bei memberfunktionen.

    den sinn von join() hast du, glaube ich, auch nicht verstanden.



  • camper schrieb:

    den sinn von join() hast du, glaube ich, auch nicht verstanden.

    Doch, jetzt schon.


Anmelden zum Antworten