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)