哪些 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 中的任何内容。
如果您在 Linux 上使用带有 GCC 编译器的 C++ 线程(或者更准确地说,使用 GCC 附带的 libstdc++ C++ 标准库),您
我很好奇是哪个库头调用了该要求? #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 中的任何内容。