C++0x "Hello Concurrent World" 在 g++/linux 上立即导致段错误?

10
浏览了一本C++0x货币书,想试着运行一下示例代码。这是最基础的代码。
#include <iostream>
#include <thread>

void hello()
{
    std::cout<<"Hello Concurrent World\n";
}


int main(int argc, char *argv[])
{
    std::thread t(hello);

    t.join();
}

编译使用:

g++ -std=c++0x -g -o pgm pgm.cpp

触发方式:

Program received signal SIGSEGV, Segmentation fault.
_dl_fixup (l=0x7ffff7b0992c, reloc_arg=<value optimized out>) at ../elf/dl-runtime.c:147
147     ../elf/dl-runtime.c: No such file or directory.
        in ../elf/dl-runtime.c

似乎是某种设置/库问题。有人熟悉这个吗?
1个回答

19

您需要使用-pthread标志进行编译/链接。


7
C++的实现不应该处理这个细节吗?否则,有std::thread有什么用处呢? - anon
7
最近你变得非常脾气暴躁:“我不喜欢Boost,新标准很糟糕等等”。我不知道是因为年纪大了还是其他什么原因,但你应该去找点乐子或者退休。 - Matthieu N.
4
@Duck: 问题出在编译器上。我使用了stdio和stdlib,编译器足够智能,可以为它们提供必要的代码,无论是在编译时静态链接还是在运行时动态链接,而无需显式地进行链接或加载。一旦gcc做好准备,情况也会相同,所以简言之,问题并不在c++0x身上,而在于编译器的实现,老年人不应该妨碍进步。 - Matthieu N.
4
@Neil Butterworth: C++0x仍然是g++的实验性扩展。我打赌当g++正式支持新标准时,他们将修复所有错误,但现在我认为向gcc团队提交错误报告可能是值得的。 - Martin York
3
@Neil Butterworth: 不要把单个编译器标志当成一场戏剧。当然,标准库不应该需要额外的标志,但是std::thread并不是标准的(至少目前不是)。一旦C++0x及其实现最终确定,事情可能会并且很可能会发生变化。现在,如果您不能使用std::thread,那么您只需要其他标志来启用替代选项,如TBB或OpenMP。编译器和链接器标志是必要的邪恶,所以尽量与之相处... - user355252
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接