g ++ - 为什么我必须通过" -pthread"使用std :: thread时的选项?

时间:2017-10-28 22:08:40

标签: c++ multithreading c++11 g++ pthreads

我只是想了解g ++使用的概念。这是我非常简单的std :: thread应用程序:

#include <iostream>
#include <thread>

void func() {
    std::cout << "Running..." <<  std::endl;
}

int main()
{
    std::thread t(func);
    t.join();
    return 0;
}

我可以使用以下命令在macOs / Xcode 9.0上进行编译:

  

g ++ main.cpp -std = c ++ 11

但是我无法使用相同的命令在Linux上编译它,据我所知,我也必须通过-pthread选项。否则它会给我以下错误:

gcc版本7.1.1 20170622(Red Hat 7.1.1-3)

main.o: In function `std::thread::thread<void (&)()>(void (&)())':
/usr/include/c++/5/thread:137: undefined reference to `pthread_create'

我认为这是不合逻辑的,我甚至不知道它是通过pthread实现std :: thread类的。为什么我必须传递-pthread选项并链接到pthread库?不是C ++ 11应该让我从平台特定的细节中抽象出来吗?或者我有任何其他替代库,如pthread,我可以链接反对我的std :: thread用法?或者我应该将其报告为错误?

感谢。

2 个答案:

答案 0 :(得分:1)

pthread是使用OS特定调用的OS特定线程的行业标准。

std::thread是C ++中的抽象,可以使用pthread或操作系统的本机线程来实现。但为了使它尽可能快地在尽可能多的操作系统上工作,std-library实现者​​可以在posix中实现它,因为它们应该适用于所有兼容的操作系统。

有一些例外,一些仅std-library的窗口使用Windows本机线程。

答案 1 :(得分:0)

根据GCC's concurrency page,有必要根据使用的功能为编译器提供其他选项。您可以验证您的GCC线程版本是否依赖POSIX线程:

$ gcc -v 2>&1 | grep "Thread model"
Thread model: posix

请参见this bug report,以了解该行为的正当理由:

问题在于,并非所有目标都需要-pthread,或者某些确实需要-pthread的拼写有所不同,并且在使用该选项时,并非所有平台都定义_REENTRANT,因此没有可靠的方法来执行您要的操作。