小工具知识网

当前位置: 首页 > 行业知识 > 【C++入门到精通】C++ thread线程库 [ C++入门 ]

行业知识

【C++入门到精通】C++ thread线程库 [ C++入门 ]

2026-11-03 07:06:14 来源:互联网转载

阅读导航

  • 引言
  • 一、thread类的简单介绍
  • 二、thread类的用法
    • 1. 创建线程
    • 2. 使用 Lambda 表达式
    • 3. 传递参数给线程
    • 4. 线程的 join 和 detach
    • 5. 检查线程是否可 join
    • 6. 线程的 ID
    • 7. 线程的移动语义
    • 8. 线程的析构
    • 注意事项
    • 三、线程函数参数
    • 温馨提示

      引言

      C++ thread线程库是C++11标准引入的一个强大工具,它提供了一种便捷的方式来创建和管理线程,使得并行编程变得更加容易和高效。这个库支持线程的创建、同步、互斥以及线程局部存储等功能。通过使用std::thread类,开发者可以轻松地创建新的线程来执行任务,并使用join()方法来等待线程完成。此外,线程库还包括了std::mutex和std::lock_guard等同步原语,以帮助管理线程间的资源访问,防止数据竞争和***锁。线程局部存储std::thread::id和thread_local关键字则允许线程拥有自己的局部数据,这在多线程环境中非常有用。总的来说,C++ thread线程库为C++开发者提供了一个功能全面、易于使用的多线程编程解决方案。让我们一起开始这段关于thread线程库的学习之旅吧。

      一、thread类的简单介绍

      std::thread 类是C++11标准库中的一个核心组件,用于创建和管理独立的线程。它允许开发者通过传递一个函数或可调用对象来初始化线程,执行并行任务。线程对象的生命周期控制着线程的执行,而通过join()和detach()方法,可以控制线程的同步和分离。此外,std::thread还提供了线程ID和状态检查功能,帮助开发者进行线程管理和异常处理,确保程序的稳定性和效率。

      注意:要使用线程库中的线程,必须包含头文件。线程类官方介绍文档

      下面这个表格包含了 std::thread 类的构造函数、赋值运算符、比较运算符以及一些用于线程管理的成员函数。这些函数提供了创建、管理、比较和销毁线程的能力.

      函数名功能描述
      id get_id()返回线程的唯一标识符。
      bool joinable()检查线程是否可 join,即是否还在运行。
      void join()等待线程结束执行。
      void detach()将线程与 std::thread 对象分离,使其在后台独立运行。
      void swap(std::thread& other)与另一个 std::thread 对象交换线程。
      thread::native_handle_type native_handle()返回线程的原生句柄,用于操作系统特定的线程操作。
      bool operator==(const thread& other) const比较两个线程是否相同。
      bool operator!=(const thread& other) const比较两个线程是否不同。
      thread() noexcept默认构造函数,创建一个未关联线程的 std::thread 对象。
      thread(nullptr_t) noexcept构造一个未关联线程的 std::thread 对象。
      explicit thread(Callable&& func, Args&&… args)构造函数,创建一个线程并启动它来执行给定的可调用对象和参数。
      thread(thread&& other) noexcept移动构造函数,获取另一个 std::thread 对象的所有权。
      thread& operator=(thread&& other) noexcept移动赋值运算符,获取另一个 std::thread 对象的所有权。
      ~thread()析构函数,如果线程可 join,则会调用 join(),否则调用 detach()。

      二、thread类的用法

      std::thread 类是 C++ 标准库中用于线程创建和管理的类。以下是 std::thread 类的一些关键用法和示例:

      1. 创建线程

      要创建一个线程,你需要实例化 std::thread 对象并传递一个函数或可调用对象(如 lambda 表达式或函数对象)作为参数。

      #include #include void threadFunction() {    std::cout     std::thread t(threadFunction);    t.join(); // 等待线程结束    return 0;}    std::thread t([]() {        std::cout     std::cout     std::thread t(threadFunctionWithArgs, 10, 3.14);    t.join();    return 0;}    std::thread t([]() {        // 线程执行的代码    });    t.detach(); // 线程现在在后台运行,不会等待它结束    // 主线程继续执行,而 t 线程在后台运行    return 0;}    std::thread t([]() {        // 线程执行的代码    });    if (t.joinable()) {        t.join(); // 线程还在运行,等待结束    }    return 0;}    std::thread t([]() {        std::cout     std::thread t1([]() {        std::cout     std::thread t([]() {        // 线程执行的代码    });    // t 在这里离开作用域,自动调用 join()} // t 的析构函数被调用    x += 10; }void ThreadFunc2(int* x) {    *x += 10; }int main() {    int a = 10; // 在线程函数中对a修改,不会影响外部实参,因为:线程函数参数虽然是引用方式,但其实际引用的是线程栈中的拷贝        std::thread t1(ThreadFunc1, a);    t1.join();         // 如果想要通过形参改变外部实参时,必须借助std::ref()函数    std::thread t2(ThreadFunc1, std::ref(a));    t2.join(); // 等待线程执行完成        // 地址的拷贝    std::thread t3(ThreadFunc2, &a);    t3.join(); // 等待线程执行完成       return 0;}

上一篇:Autofac源码深度解析,揭秘依赖注入框架的神秘面纱

下一篇:hyperv怎么链接服务器?