我只是想了解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用法?或者我应该将其报告为错误?
感谢。
答案 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,因此没有可靠的方法来执行您要的操作。