深入应用C++11 笔记---多线程 (六)

本文详细介绍了C++11中的多线程特性,包括如何创建线程,线程的基本用法。线程可以通过线程函数或函数对象启动,并能传递参数。线程的生命周期管理至关重要,需要避免线程对象过早析构导致的问题,可以通过`join`或`detach`来管理。此外,还讨论了如何获取当前线程信息和实现线程休眠。
摘要由CSDN通过智能技术生成

C++11 多线程

1. 线程的创建
  • 使用线程函数或者函数对象,并且可以同时制定线程函数的参数

    
    #include<thread>
    
    void func(){/*do something*/}
    int main()
    {
      std::thread t(func);
      t.join();//阻塞线程,直到函数执行结束
      //t.detach();   将线程和线程对象分离
      return 0;
    }

    函数func将会运行于线程对象t中,join函数将会阻塞线程,直到线程函数执行结束,如果线程函数由返回值,返回值将会被忽略。如果不希望线程被阻塞执行,可以调用线程的detach()方法,将线程和线程对象分离,让线程作为后台线程去执行。 detach之后就无法再和线程发生联系了。主进程结束的时候,即便是detach()出去的子线程不管有没有完成都会被强制杀死

  • 线程还可以接收任意个数的参数

    void func(int i,double d,const std::string& s)
    {
      std::cout<<i<<","<<d<<","<<s<<std::endl;
    }
    int main()
    {
      std::thread t(func,1,2,"test");
      t.join();
      return 0;
    }

    注意:std::thread 出了作用域之后将会析构,如果线程函数没有执行完将会发生错误,因此,需要保证线程函数的生命周期在线程变量std::thread的生命周期之内。

  • 线程不能复制,但是可以移动

    
    #include<thread>
    
    void func(){/*do something*/}
    int main()
    {
      std::thread t(func);
      std::thread t1(std::move(t));
      t.join();
      t2.join();
      return 0;
    }
  • 通过将线程对象保存到一个容器中,以保证线程对象的生命周期。

    ​ 由于线程对象可能先于线程函数结束,所以应该保证线程对象的生命周期在线程函数执行完时仍然存在。可以通过join阻塞等待线程函数执行完成,或者通过detach方法让程序在后台执行,还可以通过将线程对象保存到一个容器中,以保证线程对象的生命周期。

    std::vector<std::thread> g_list;
    std::vector<std::shared_ptr<std::thread>> g_list2;
    void CreateThread()
    {
      std::thread t(func);
      g_list.push_back(std::move(t));
      g_list2.push_back(std::make_shared<std::thread>(func));
    }
    
    int main()
    {
      CreateThread();
      for(auto& thread:g_list)
      {
          thread.join;
    }
      for(auto& thread:g_list2)
      {
          thread->join();
      }
      return 0;
    }
2. 线程的基本用法
  • 获取当前信息

    ​ 线程可以获取当前线程的ID,还可以获取CPU核心数量

    void fun(){/*do something*/}
    int main()
    {
      std::thread t(func);
      cout<<t.get_id()<<endl;//获取当前线程ID
      //获取当前CPU核数,如果获取失败则返回0
      cout<<std::thread::hardware_concurrency()<<endl;
      return 0;
    }
  • 线程休眠

    std::this_thread::sleep_for(std::chrono::seconds(3));//线程休眠3

    声明:以上主要来源于深入应用C++11 这本书,强烈推荐

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值