C++ 11线程,错误信息为“调用纯虚函数”

8

这是一段非常简洁的C++11线程API代码,我正在尝试编译。

#include<iostream>
#include<thread>

using namespace std;

void threadFunction(void)
{
    cout<<"hello from thread:";//<<this_thread::get_id()<<endl;
}

int main()
{
    std::thread t(threadFunction);
    t.join();

    return 0;
}



将此代码编译为:g++ thread1.cpp -pthread -std=c++11
我遇到了以下错误:
调用了纯虚方法
未捕获异常的强制终止
中止


有什么问题,可以有人帮忙吗?
请注意,我在ARM A8处理器的Beaglebone Black上进行编译。


你的操作系统和编译器版本是什么? - Massa
也许你的编译命令写错了?这很奇怪。我在这里尝试过(http://www.compileonline.com/compile_cpp11_online.php),它可以工作。(编译命令 "g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1")。 - Iosif Murariu
这是在运行Angstrom Linux的Beaglebone Black上。我还使用putty通过USB连接到我的Beaglebone。 - Anjanu
losif Marariu 尝试了您的编译命令,但是出现了相同的错误。 - Anjanu
@Scooby 这不是未定义行为的工作方式(包括不可决性等)。但在这种特定情况下,代码确实是完全可接受的。我在g++ 4.8.1中遇到了一个不同的问题,可以在此处找到描述。 - Voo
显示剩余4条评论
3个回答

6

这是一个有关于libstdc++或Clang的bug,具体由谁造成尚未确定。如果您使用的是2013年10月之后发布的版本,则应该能正常工作。当您运行g++ --version命令时,会显示什么信息?

作为解决方法,您可以尝试使用以下命令行。我们并不保证它一定有效,请在评论中告知您的结果。

g++ -pthread -std=c++11 -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_{1,2,4} thread1.cpp

以下是错误报告:

http://llvm.org/bugs/show_bug.cgi?id=12730

这是 Clang 驱动程序的官方修复程序:

https://llvm.org/viewvc/llvm-project?view=revision&revision=191707

我不知道 GCC 驱动程序之前是否也有这个 bug,以及是否已经修复。


4

我在使用搭载ARM Cortex-A7的Raspberry Pi 2 Model B时遇到了同样的问题。使用g++-4.7编译时,问题出在一个编译器标志上:

-march=armv7-a

1

实际上这是一个OpenEmbedded的bug。在修复之前更好的解决方法是使用“-mcpu=cortex-a8”。请参考OE Core thread获取上下文。 - pabigot

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