哪些 C++ 标准库头文件调用了 GCC 的 -pthread 选项要求?

Which C++ standard library headers invoke a requirement for the -pthread option with GCC?

如果您在 Linux 上使用带有 GCC 编译器的 C++ 线程(或者更准确地说,使用 GCC 附带的 libstdc++ C++ 标准库),您 在构建过程中获得正确编译和 link 的东西。

我很好奇是哪个库头调用了该要求? #include <thread> 是一个明显的问题,但是是否还有其他标准库头文件隐式地具有 libstdc++ 的 pthread 依赖性?

在版本 10 之前的 Solaris 上,errno 在单线程构建中是一个全局变量,但在多线程构建中是一个扩展为函数调用的宏。当人们无意中将多线程应用程序与单线程库链接时,这就是问题的根源。有关详细信息,请参阅 Compiling Multithreaded Code

在 Linux 上,errno 始终是一个扩展为读取线程特定 errno 的函数调用的宏,无论是否指定 -pthread

使用 -pthread 编译定义宏 _REENTRANT,但 GNU C 和 C++ 标准库头文件的 none 使用该宏。 Boost 库确实使用它。

与其说是头文件,不如说是具体的功能。任何在幕后创建线程的东西都需要或极大地受益于与 -lpthread 的链接,例如来自 <future>.

std::async

<thread> <mutex> <condition_variable> <future> <shared_mutex> <stop_token> 全部使用 Pthreads 类型和函数。

Networking TS headers 例如 <experimental/net><experimental/executor> 使用 <mutex><future> 所以它们也依赖于 Pthreads。

我们将很快添加更多并发性 headers,例如 <latch> <barrier> <semaphore>

基本上与并发和同步相关的所有内容,除了 <atomic>,它不依赖于 Pthreads 中的任何内容。