zoukankan      html  css  js  c++  java
  • C++11并发编程:多线程std::thread

    作者:蜗牛201
    出处:https://www.cnblogs.com/woniu201/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。

    一:概述

    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 }
    复制代码

  • 相关阅读:
    Hadoop 学习笔记 (十) hadoop2.2.0 生产环境部署 HDFS HA Federation 含Yarn部署
    hadoop 2.x 安装包目录结构分析
    词聚类
    Hadoop 学习笔记 (十一) MapReduce 求平均成绩
    Hadoop 学习笔记 (十) MapReduce实现排序 全局变量
    Hadoop 学习笔记 (九) hadoop2.2.0 生产环境部署 HDFS HA部署方法
    Visual Studio Code 快捷键大全(Windows)
    Eclipse安装教程 ——史上最详细安装Java &Python教程说明
    jquery操作select(取值,设置选中)
    $.ajax 中的contentType
  • 原文地址:https://www.cnblogs.com/buzhidao1/p/13409919.html
Copyright © 2011-2022 走看看