• C++11并发编程:多线程std::thread


    一:概述

    C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改。现在在C++11中只需使用语言层面的thread可以解决这个问题。

    所需头文件<thread>

    二:构造函数

    1.默认构造函数

    thread() noexcept
    一个空的std::thread执行对象

    2.初始化构造函数

    template<class Fn, class... Args>
    explicit thread(Fn&& fn, Args&&... args);
    创建std::thread执行对象,线程调用threadFun函数,函数参数为args。

    1 void threadFun(int a)
    2 {
    3     cout << "this is thread fun !" << endl;
    4 }
    5 
    6 thread t1(threadFun, 2);

    3.拷贝构造函数

    thread(const thread&) = delete;
    拷贝构造函数被禁用,std::thread对象不可拷贝构造

    1 void threadFun(int& a)
    2 {
    3     cout << "this is thread fun !" << endl;
    4 }
    5     
    6 int value = 2;
    7 thread t1(threadFun, std::ref(value));

    4.Move构造函数

    thread(thread&& x)noexcept
    调用成功原来x不再是std::thread对象

    1 void threadFun(int& a)
    2 {
    3     cout << "this is thread fun !" << endl;
    4 }
    5 
    6 int value = 2;
    7 thread t1(threadFun, std::ref(value));
    8 thread t2(std::move(t1));
    9 t2.join();

    三:成员函数

    1.get_id()

    获取线程ID,返回类型std::thread::id对象。

     1 thread t1(threadFun);
     2 thread::id threadId = t1.get_id();
     3 cout << "线程ID:" << threadId << endl;
     4 
     5 //threadId转换成整形值,所需头文件<sstream>
     6 ostringstream   oss;
     7 oss << t1.get_id();
     8 string strId = oss.str();
     9 unsigned long long tid = stoull(strId);
    10 cout << "线程ID:" << tid << endl;

    2.join()

    创建线程执行线程函数,调用该函数会阻塞当前线程,直到线程执行完join才返回。

    thread t1(threadFun);
    t1.join()  //阻塞等待

    3.detach()

    detach调用之后,目标线程就成为了守护线程,驻留后台运行,与之关联的std::thread对象失去对目标线程的关联,无法再通过std::thread对象取得该线程的控制权。

    4.swap()

    交换两个线程对象

    1 thread t1(threadFun1);
    2 thread t2(threadFun2);
    3 cout << "线程1的ID:" << t1.get_id() << endl;
    4 cout << "线程2的ID:" << t2.get_id() << endl;
    5 
    6 t1.swap(t2);
    7 
    8 cout << "线程1的ID:" << t1.get_id() << endl;
    9 cout << "线程2的ID:" << t2.get_id() << endl;

    5.hardware_concurrency()

    获得逻辑处理器储量,返回值为int型

     1 int coreNum = thread::hardware_concurrency(); 

    四:使用

     1.创建线程

     1 void threadFun1()
     2 {
     3     cout << "this is thread fun1 !" << endl;
     4 }
     5 
     6 int main()
     7 {
     8     thread t1(threadFun1);
     9     t1.join();
    10 
    11     getchar();
    12     return 1;
    13 }

    2.创建线程,传参

     1 void threadFun1(int v)
     2 {
     3     cout << "this is thread fun1 !" << endl;
     4     cout << v << endl;
     5 }
     6 
     7 int main()
     8 {
     9     int value = 6;
    10     thread t1(threadFun1, value);
    11     t1.join();
    12 
    13     getchar();
    14     return 1;
    15 }

    需要注意,变量int value 和int v 做变量传递时并不是引用,而是对变量做了拷贝,所以在传递给int v前,int value不能出作用域(释放了内存),join(),可以保证int value变量释放内存,如果使用detach(),可能存在这种情况。

    3.创建线程,引用传参

     1 void threadFun1(int& v)
     2 {
     3     cout << "this is thread fun1 !" << endl;
     4     cout << v << endl;
     5 }
     6 
     7 int main()
     8 {
     9     int value = 6;
    10     thread t1(threadFun1, std::ref(value));
    11     t1.join();
    12 
    13     getchar();
    14     return 1;
    15 }

    4.创建建线程,线程函数为类成员函数

     1 class Object
     2 {
     3 public:
     4     Object()
     5     {
     6         cout << "构造函数" << endl;
     7     }
     8 
     9     ~Object()
    10     {
    11         cout << "析构函数" << endl;
    12     }
    13 
    14     void fun(string info)
    15     {
    16         cout << info << endl;
    17     }
    18 
    19 };
    20 
    21 int main()
    22 {
    23 
    24     Object obj;
    25     string str = "我是一个类的成员函数!";
    26     thread t1(&Object::fun, &obj, str);
    27     t1.join();
    28 
    29     getchar();
    30     return 1;
    31 }

     

    扫码关注公众号

    专注分享C/C++,C++(11,14,17),STL,Java,Spring,mybatis,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,还有高薪互联网职位内推,在这里一起探讨,一起学习,一起进步,同时不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣!

  • 相关阅读:
    Netty3实现服务端和客户端
    Nio实现服务端
    python学习笔记8-邮件模块
    python学习笔记8-异常处理
    python学习笔记8--面向对象编程
    python番外篇--sql注入
    python学习笔记7-网络编程
    python学习笔记7-excel操作
    python学习笔记6--双色球需求实现
    python学习笔记6--操作redis
  • 原文地址:https://www.cnblogs.com/woniu201/p/10145044.html
Copyright © 2020-2023  润新知