FindThreads

查找并确定系统中的线程库以支持多线程。

find_package(Threads [...])

多线程支持在一个程序内实现并发执行,通常是通过创建多个执行线程。最常见的情况是,在类 Unix 系统上使用 POSIX 线程(pthreads)等库,或者在 Windows 上使用 Windows 线程。

此模块抽象了平台特定差异,并检测如何启用线程支持——无论是需要链接到特定库、添加编译器标志(如 -pthread),还是两者都需要。在某些平台上,线程也隐式地包含在默认库中,无需使用额外的标志或库。

此模块适用于 C 和 C++ 项目(有时也适用于其他编译型语言),这些项目依赖于系统级别的线程 API。

使用此模块可以确保项目在不同平台上正确构建,因为它以可移植的方式处理线程支持的检测和设置。

C 和 C++ 语言标准

C11 标准通过 <threads.h> 头文件引入了一个最小化的跨平台线程 API,而 C++11 在标准库中添加了 <thread> 头文件,提供了高级多线程支持。这些标准头文件允许在语言级别编写可移植的线程代码,而无需直接使用 pthreads 或 Windows 线程等平台特定 API。

然而,即使有标准的 C11 或 C++11 线程支持,对于某些应用程序,可能仍需要平台特定的编译器或链接器标志(例如,类 Unix 系统上的 -pthread)。这就是 FindThreads 仍然有用的地方——它确保这些标志和任何必需的库都得到正确设置,即使没有显式使用系统 API。

简而言之

  • 在源代码中使用 <thread>(C++11 及更高版本)或 <threads.h>(C11)以实现可移植性和更简单的语法。

  • 在 CMake 项目中使用 find_package(Threads),当应用程序需要传统的线程支持,并确保代码在不同平台上正确编译和链接。

导入的目标

此模块提供以下 导入目标

Threads::Threads

版本 3.1 中新增。

封装了通过标志或线程库(如果找到)启用线程的使用需求的 target。如果检测到线程支持,则此 target 可用。

结果变量

此模块定义了以下变量

Threads_FOUND

布尔值,指示 Threads 是否受支持,无论是通过单独的库还是标准库。

CMAKE_THREAD_LIBS_INIT

要使用的线程库。如果线程函数由系统库提供,并且不需要特殊标志即可使用它们,则此变量可能为空。

CMAKE_USE_WIN32_THREADS_INIT

如果找到的线程库是 win32 库。

CMAKE_USE_PTHREADS_INIT

如果找到的线程库与 pthread 兼容。

CMAKE_HP_PTHREADS_INIT

如果找到的线程库是 HP 线程库。

影响行为的变量

在调用 find_package(Threads) 之前,此模块接受以下变量:

THREADS_PREFER_PTHREAD_FLAG

版本 3.1 中新增。

如果优先使用 -pthread 编译器和链接器标志,则调用者可以将此变量设置为布尔值 true。编译器标志只能与导入的 target 一起使用。强烈建议新代码同时使用导入的 target 和此开关。

如果系统库提供线程函数(即 CMAKE_THREAD_LIBS_INIT 为空),则此变量无效。

示例

查找 Threads 并将导入的 target 链接到项目 target

set(THREADS_PREFER_PTHREAD_FLAG TRUE)
find_package(Threads)
target_link_libraries(example PRIVATE Threads::Threads)