00_linux_app_thread

本文提供了一个C语言使用pthread库创建和管理线程的例子。代码创建了两个线程Thread1和Thread2,分别打印不同的信息,并通过pthread_join等待线程执行结束。

1.线程的实例代码

#include <stdio.h>
#include <pthread.h>

//定义线程要执行的函数,arg 为接收线程传递过来的数据
void *Thread1(void *arg)
{
    printf("http://c.biancheng.net\n");
    return "Thread1成功执行";
}

//定义线程要执行的函数,arg 为接收线程传递过来的数据

void* Thread2(void* arg)
{
    printf("hello world!\n");
    return "Thread2成功执行";
}

int main(int argc,char*argv[])
{

    int res;

    pthread_t mythread1, mythread2;

    void* thread_result;

    /*创建线程
    &mythread:要创建的线程
    NULL:不修改新建线程的任何属性
    ThreadFun:新建线程要执行的任务
    NULL:不传递给 ThreadFun() 函数任何参数
    返回值 res 为 0 表示线程创建成功,反之则创建失败。
    */
    res = pthread_create(&mythread1, NULL, Thread1, NULL);
    if (res != 0) {
        printf("线程创建失败");
        return 0;
    }

    res = pthread_create(&mythread2, NULL, Thread2, NULL);
    if (res != 0) {
        printf("线程创建失败");
        return 0;
    }

    /*
    等待指定线程执行完毕
    mtThread:指定等待的线程
    &thead_result:接收 ThreadFun() 函数的返回值,或者接收 pthread_exit() 函数指定的值
    返回值 res 为 0 表示函数执行成功,反之则执行失败。
    */
    res = pthread_join(mythread1, &thread_result);
    //输出线程执行完毕后返回的数据
    printf("%s\n", (char*)thread_result);

    res = pthread_join(mythread2, &thread_result);
    printf("%s\n", (char*)thread_result);
    printf("主线程执行完毕\n");

    return 0;

}

<think>我们正在讨论CMake中的CMAKE_THREAD_LIBS变量。根据引用[1]中的内容,我们看到有这样的用法: TARGET_LINK_LIBRARIES(logic ${LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) 注意,这里使用的是CMAKE_THREAD_LIBS_INIT,而不是CMAKE_THREAD_LIBS。实际上,在CMake中,与线程库相关的变量通常是CMAKE_THREAD_LIBS_INIT。 因此,我们需要澄清:用户询问的是CMAKE_THREAD_LIBS,但实际在CMake中,通常使用的是CMAKE_THREAD_LIBS_INIT。可能用户指的是这个变量,或者存在混淆。 让我们根据引用[1]的信息和CMake的常规用法来解释。 在CMake中,当我们使用`find_package(Threads)`命令后,CMake会尝试查找当前系统上的线程库(如pthreads、win32 threads等),并设置一些变量,其中就包括`CMAKE_THREAD_LIBS_INIT`(或`Threads::Threads`目标)。这个变量包含了链接到线程库所需的库。 所以,我们应该解释`CMAKE_THREAD_LIBS_INIT`(通常也称为`CMAKE_THREAD_LIBS`?)但实际上,在CMake文档中,标准的变量是`CMAKE_THREAD_LIBS_INIT`。 另外,引用[3]提到模块化是现代CMake的方向,因此我们也可以提到使用目标(target)的方式。 综上,我们回答的重点应该是: 1. 首先说明,在CMake中,通常使用`find_package(Threads)`来查找线程库,然后会设置变量`CMAKE_THREAD_LIBS_INIT`(有时也可能有`Threads::Threads`目标)。 2. 解释`CMAKE_THREAD_LIBS_INIT`的含义:它包含了链接到系统线程库所需的链接器标志(例如,在Linux下可能是"-lpthread")。 3. 用法:在`target_link_libraries`命令中引用这个变量,或者使用导入的目标`Threads::Threads`。 但是,用户明确提到了“CMAKE_THREAD_LIBS”,我们需要注意的是,在CMake中并没有一个标准的变量叫做`CMAKE_THREAD_LIBS`。可能是用户看到了`CMAKE_THREAD_LIBS_INIT`的简写或者误写。 因此,我们的回答应该基于`CMAKE_THREAD_LIBS_INIT`。 另外,引用[4]展示了一个使用`option`和条件编译的例子,但和线程无关,我们可以忽略。引用[5]则是一些平台相关的设置,与线程库也没有直接关系。 所以,我们回答如下: </think>### CMAKE_THREAD_LIBS_INIT 的定义与用法详解 在 CMake 中,`CMAKE_THREAD_LIBS_INIT` **不是直接定义的用户变量**,而是通过 `find_package(Threads)` 命令自动生成的系统变量。其核心作用是为多线程程序提供正确的线程库链接信息。 #### 1. **定义与特性** - **自动生成**:当执行 `find_package(Threads)` 时,CMake 会检测系统线程库(如 Linux 的 `pthread`、Windows 的线程 API 等),并自动设置 `CMAKE_THREAD_LIBS_INIT` 变量。 - **平台无关**:该变量值根据操作系统动态生成: - Linux/macOS:通常为 `-lpthread` - Windows:通常为空(因线程支持已内置于系统库) - **初始化变量**:`_INIT` 后缀表示这是线程库的基础链接标志,通常直接用于链接阶段。 #### 2. **典型用法** 在项目的 `CMakeLists.txt` 中需分三步使用: ```cmake # 1. 声明依赖线程库 find_package(Threads REQUIRED) # 2. 定义可执行文件/库 add_executable(my_app main.cpp) # 3. 链接线程库 target_link_libraries(my_app PRIVATE ${CMAKE_THREAD_LIBS_INIT} # 插入线程链接标志 ) ``` #### 3. **关键注意事项** - **现代 CMake 推荐**:优先使用导入目标 `Threads::Threads`(更面向对象): ```cmake target_link_libraries(my_app PRIVATE Threads::Threads) ``` 此方式自动处理包含目录、编译选项及链接库[^1][^3]。 - **变量作用域**:`CMAKE_THREAD_LIBS_INIT` 是全局变量,项目内所有目标均可引用。 - **与编译标志分离**:线程相关的**编译选项**(如 `-pthread`)通常由 `CMAKE_CXX_FLAGS` 处理,而链接库由该变量处理[^2][^5]。 #### 4. **应用场景示例** 结合可选功能配置(如引用[4]的 `option` 模式): ```cmake option(USE_MULTITHREADING "Enable multithreading support" ON) if(USE_MULTITHREADING) find_package(Threads REQUIRED) target_link_libraries(my_app PRIVATE ${CMAKE_THREAD_LIBS_INIT}) endif() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值