Why does this simple std::thread example not work?

后端 未结 5 583
无人及你
无人及你 2020-12-01 02:41

Tried the following example compiled with g++ -std=gnu++0x t1.cpp and g++ -std=c++0x t1.cpp but both of these result in the example aborting.

相关标签:
5条回答
  • 2020-12-01 03:12

    For what it's worth, I had different issue with similar code using threads in g++ (MinGW). Work-around was to put some "delay" between creating a thread and joining it.

    Code with infrequently failing assertion:

    std::atomic_bool flag{false};
    std::thread worker( [&] () { flag.store(true); } );
    worker.join();
    assert(flag.load()); // Sometimes fails
    

    Work-around:

    std::atomic_bool flag{false};
    std::thread worker( [&] () { flag.store(true); } );
    while (not flag.load()) { std::this_thread::yield(); }
    worker.join();
    assert(flag.load()); // Works fine
    

    Note that yield() alone did not help, hence the while loop. Using sleep_for(...) also works.

    0 讨论(0)
  • 2020-12-01 03:16

    Please use the pthread library during the compilation: g++ -lpthread.

    0 讨论(0)
  • 2020-12-01 03:22

    You need to link to run time library

    0 讨论(0)
  • 2020-12-01 03:30

    You have to join std::threads, just like you have to join pthreads.

    int main( int argc, char *argv[] )
    {
        std::thread t( doSomeWork );
        t.join();
        return 0;
    }
    

    UPDATE: This Debian bug report pointed me to the solution: add -pthread to your commandline. This is most probably a workaround until the std::thread code stabilizes and g++ pulls that library in when it should (or always, for C++).

    0 讨论(0)
  • 2020-12-01 03:33

    Simplest code to reproduce that error and how to fix:

    Put this in a file called s.cpp:

    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <unistd.h>
    #include <thread>
    using namespace std;
    void task1(std::string msg){
      cout << "task1 says: " << msg;
    }
    int main(){
        std::thread t1(task1, "hello");
        usleep(1000000);
        t1.detach();
    }
    

    Compile like this:

    el@apollo:~/foo7$ g++ -o s s.cpp -std=c++0x
    

    Run it like this, the error happens:

    el@apollo:~/foo7$ ./s
    terminate called after throwing an instance of 'std::system_error'
      what():  Operation not permitted
    Aborted (core dumped)
    

    To fix it, compile it like this with the -pthread flag:

    g++ -o s s.cpp -std=c++0x -pthread
    ./s
    

    Then it works correctly:

    task1 says: hello
    
    0 讨论(0)
提交回复
热议问题