尝试使用g++ -std=gnu++0x t1.cpp
和g++ -std=c++0x t1.cpp
编译的以下示例,但这两个示例都导致示例中止。
$ ./a.out
terminate called after throwing an instance of 'std::system_error'
what():
Aborted
以下是样本:
#include <thread>
#include <iostream>
void doSomeWork( void )
{
std::cout << "hello from thread..." << std::endl;
return;
}
int main( int argc, char *argv[] )
{
std::thread t( doSomeWork );
t.join();
return 0;
}
我在Ubuntu 11.04上尝试这个:
$ g++ --version
g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
任何人都知道我错过了什么?
答案 0 :(得分:45)
您必须join
std::thread
,就像您必须加入pthreads
一样。
int main( int argc, char *argv[] )
{
std::thread t( doSomeWork );
t.join();
return 0;
}
更新: This Debian bug report向我指出了解决方案:在命令行中添加-pthread
。这很可能是一种解决方法,直到std::thread
代码稳定并且g ++将该库拉到应该(或者总是为C ++)的时候。
答案 1 :(得分:13)
请在编译期间使用pthread库:g ++ -lpthread。
答案 2 :(得分:3)
将它放在名为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();
}
像这样编译:
el@apollo:~/foo7$ g++ -o s s.cpp -std=c++0x
像这样运行,发生错误:
el@apollo:~/foo7$ ./s
terminate called after throwing an instance of 'std::system_error'
what(): Operation not permitted
Aborted (core dumped)
要修复它,请使用-pthread标志进行编译:
g++ -o s s.cpp -std=c++0x -pthread
./s
然后它正常工作:
task1 says: hello
答案 3 :(得分:0)
对于它的价值,我使用g ++(MinGW)中的threads与类似代码进行了不同的问题。解决方法是放一些&#34;延迟&#34;在创建一个线程和加入它之间。
不经常断言的代码:
std::atomic_bool flag{false};
std::thread worker( [&] () { flag.store(true); } );
worker.join();
assert(flag.load()); // Sometimes fails
解决方法:
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
请注意,仅yield()
没有帮助,因此是while循环。使用sleep_for(...)
也可以。
答案 4 :(得分:-2)
您需要链接到运行时库