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.
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.
Please use the pthread library during the compilation: g++ -lpthread.
You need to link to run time library
You have to join
std::thread
s, 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++).
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