繁体   English   中英

g++ - 为什么在使用 std::thread 时必须传递“-pthread”选项?

[英]g++ - Why do I have to pass "-pthread" option while using std::thread?

我只是想理解 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(红帽 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 使用? 还是我应该将其报告为错误?

谢谢。

根据GCC 的并发页面,有必要根据所使用的功能为编译器提供额外的选项。 您可以验证您的 GCC 线程版本是否依赖于 POSIX 线程:

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

有关行为的理由,请参阅此错误报告

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

pthread是操作系统特定线程的行业标准,使用操作系统特定调用。

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

也有例外,一些 windows 只有std-library使用 windows 本机线程代替。

我正在将 pthread 移动到 C++11 中的 std:thread 并且遇到了与您遇到的相同的现象,并且我发现了这篇文章——这可能是正确的答案: https ://developers.redhat.com/articles /2021/12/17/why-glibc-234-removed-libpthread#

一个快速的结论:这取决于 glibc 的版本,2.34 之前版本的 glibc 将需要 -lpthead 标志,即使代码没有显式使用 pthread。

要检查 glibc 的版本,我们可以使用ldd --version命令,在我的 ubuntu 20.04 上,它返回如下: ldd (Ubuntu GLIBC 2.31-0ubuntu9.9) 2.31 ,所以我仍然必须添加 -lpthread 标志才能使用 std :线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM