Probleme mit std::thread



  • Hoi,
    ich glaub ich kann mir hier eine genaue Beschreibung sparen. Wieso funktioniert das nicht?

    #include <thread>
    #include <iostream>
    #include <unistd.h>
    
    void print_task()
    {
       while(true)
       {
          std::cout << "Hello from " << getpid() << '\n';
          usleep(5000000);
       }
    }
    
    int main()
    {
       std::thread thread1(&print_task);
       usleep(2500000);
       std::thread thread2(&print_task);
       thread1.join();
       thread2.join();
    }
    

    Beim erzeugen des ersten Threads bekomme ich sofort ein

    terminate called after throwing an instance of 'std::system_error'
    what(): Operation not permitted
    Abgebrochen

    um die Ohren. An was könnte es liegen?

    Danke und Grüße,
    Ethon



  • Für mal als root das Programm aus.



  • Bereits probiert und auch nicht wirklich sinnvoll ... wieso sollten non-root Programme keine Threads erstellen dürfen. 😉


  • Mod

    Ich weiß zwar nicht was passiert, wenn du es nicht machst und wieso sich das Programm dann überhaupt erzeugen lässt, aber: Du musst noch gegen pthread linken, dann funktioniert's.

    edit: Oder besser noch, falls du den gcc benutzt: Die -pthread-Option linkt nicht nur gegen libpthread, sondern macht auch, dass gewisse Standardfunktionen reentrant werden, was sicher nützlich ist, wenn man mit threads arbeitet.



  • stop mal!

    std::thread? ich denk das ist erst beim neuen standard dabei, und bisher noch nicht supportet?!



  • SeppJ schrieb:

    Ich weiß zwar nicht was passiert, wenn du es nicht machst und wieso sich das Programm dann überhaupt erzeugen lässt, aber: Du musst noch gegen pthread linken, dann funktioniert's.

    edit: Oder besser noch, falls du den gcc benutzt: Die -pthread-Option linkt nicht nur gegen libpthread, sondern macht auch, dass gewisse Standardfunktionen reentrant werden, was sicher nützlich ist, wenn man mit threads arbeitet.

    Das hilft, danke. 😉
    Ich frag mich nur wieso man das manuell machen muss, der Rest der Standard-Bibliothek muss ja auch nicht manuell gelinkt werden ...



  • Skym0sh0 schrieb:

    std::thread? ich denk das ist erst beim neuen standard dabei, und bisher noch nicht supportet?!

    Kommt auf den Compiler bzw. die Bibliothek an. MSVC2010 und GCC (ich glaube ab 4.6) haben std::thread schon mit drin.



  • pumuckl schrieb:

    Skym0sh0 schrieb:

    std::thread? ich denk das ist erst beim neuen standard dabei, und bisher noch nicht supportet?!

    Kommt auf den Compiler bzw. die Bibliothek an. MSVC2010 und GCC (ich glaube ab 4.6) haben std::thread schon mit drin.

    Also mein MSVC2010 hat <thread> noch nicht. Aber in VC++11 soll es kommen.

    http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx



  • pumuckl schrieb:

    GCC (ich glaube ab 4.6) haben std::thread schon mit drin.

    std::thread gibt es seit gcc-4.4.



  • Sry, da hab ich wohl falsch gelegen - GCC kenn ich nicht gut genug und MSVC war ich der Meinung, in meinem Code bereits std::thread zu benutzen - denkste...



  • Dachte auch der MSVC 2011 kann keine variadic Templates? Dann wird auch der std::thread nur teilweise unterstützen können.



  • Ethon_ schrieb:

    Dachte auch der MSVC 2011 kann keine variadic Templates? Dann wird auch der std::thread nur teilweise unterstützen können.

    MSVC2010 bietet für viele variadics aus der Standardbibliothek entsprechende Überladungen für 0-<MagicNumber> Argumente, so wie es Boost auch macht.


Anmelden zum Antworten