序言

  • 之前的文章介绍了 进程和线程的基本概念,以及 C语言多线程的基本函数

  • 现对C++中多线程创建的几种方式做一个总结(学习记录)

1. 多线程

  • c++11中引入了线程类thread,头文件

    #include <thread>
    
  • 创建多线程的方法

    std::thread threadName(函数名, 参数1, 参数2, ...)
    
    std::thread threadName(functionName, leftValueArg, rightValueArg, std::ref(refArg), std::cref(constRefArg));
    

    传参可以传左值、右值、引用使用std::ref、const引用使用std::cref;
    参数先copy或move到std::thread对象,再move给函数

  • 程序至少有一个线程(主线程),一旦创建了std::thread对象也就是在主线程外创建了一个子线程,其立刻开始运行

2. 多线程的创建

常见的线程创建方式如下:

1. 普通函数
2. 成员函数
3. 仿函数
4. lambda函数
  • 线程创建方式1:普通函数
#include <iostream>
#include <thread>void Function(int a, int& b)
{a = 2;b = 2;
}int main()
{int a = 1;int b = 1;// create sub-threadstd::thread newThread(Function, a, std::ref(b));std::cout << a << " " << b << std::endl;// main thread waiting for sub-thread to finishnewThread.join();return 0;
}
// 编译运行
g++ --o main main.cpp -pthread
  • 线程创建方式2:成员函数
#include <iostream>
#include <thread>class MyClass {public:void Function(const int& num){std::cout << "I am " << num << " yeas old" << std::endl;}
};int main()
{MyClass object;int num = 29;// create sub-threadstd::thread newThread(&MyClass::Function, &object, std::cref(num));// main thread waiting for sub-thread to finishnewThread.join();return 0;
}
  • 线程创建方式3:仿函数
#include <iostream>
#include <thread>class MyClass {public:void operator() (int& num){std::cout << "sub-thread start" << std::endl; num = 30;std::cout << "sub-thread end" << std::endl; }
};int main()
{std::cout << "main thread start" << std::endl;MyClass object;int num = 29;std::cout << "num = " << num << std::endl;// create sub-threadstd::thread newThread(object, std::ref(num));// std::thread newThread(MyClass(), std::ref(num)); 也可// main thread waiting for sub-thread to finishnewThread.join();std::cout << "num = " << num << std::endl;std::cout << "main thread end" << std::endl;return 0;
}
// 上面的例子,也可如下实现
...
int main()
{// MyClass object; // no need to create objectstd::thread newThread(MyClass(), std::ref(num));...
}
  • 线程创建方式4:匿名函数lambda
#include <iostream>
#include <thread>int main()
{auto function = [](int a) { std::cout << a << '\n'; };// create sub-threadstd::thread newThread(function, 10);newThread.join();return 0;
}
// 或以如下方式调用lambda函数
#include <iostream>
#include <thread>int main()
{// create sub-threadstd::thread newThread([](int a) {std::cout << a << std::endl;}, 10);newThread.join();return 0;
}

参考文章:

多线程与单线程的对比
线程创建的几种方式
cpp官网线程创建的几种方式
ros多线程创建

created by shuaixio, 2022.04.30

【linux多线程】c++多线程的几种创建方式相关推荐

  1. Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题

    Java多线程:多线程同步安全问题的 "三" 种处理方式 ||多线程 "死锁" 的避免 || 单例模式"懒汉式"的线程同步安全问题 每博一文 ...

  2. java中字符串的创建_【转载】 Java中String类型的两种创建方式

    本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...

  3. 线程的三种创建方式以及代码实现

    线程和进程的概念 一个进程可以有多个线程 程序:是指令和数据的有序集合(静态的) 进程:是执行程序的一次执行过程(动态的),是系统资源分配的单位.在操作系统中运行的程序就是进程. 通常在一个进程中可以 ...

  4. 单例对象会被jvm的gc时回收吗_设计模式专题02-单例五种创建方式

    单例五种创建方式(下一篇:工厂模式) 什么是单例 保证一个类只有一个实例,并且提供一个访问该全局访问点 单例应用场景 1. Windows的Task Manager(任务管理器)就是很典型的单例模式( ...

  5. Java线程池的四种创建方式

    Java线程池的四种创建方式 Java使用Thread类来表示线程,所有的线程都是Thread类或者是他的子类.Java有四种方式来创建线程. (1)继承Thread类创建线程 (2)实现Runnab ...

  6. 【无标题】单例模式的两种创建方式:饿汉式和懒汉式

    这里写自定义目录标题 单例模式的两种创建方式:饿汉式和懒汉式 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂 ...

  7. 线程池概念、线程池作用、线程池的四种创建方式

    线程池 1.1.什么是线程池? 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程.线程池中线程的数量通常完全取决于可用内存数量和应用程 ...

  8. 线程的三种创建方式和他们的优缺点

    文章目录 一.线程的三种创建方式 1.继承Thread 2.实现Runable接口 3.实现Callable接口 二.三种创建方式的优缺点 1.使用Runnable接口比使用继承Thread的优势 2 ...

  9. SAP QM 04类型检验批的另外一种创建方式

    SAP QM 04类型检验批的另外一种创建方式 物料号:ZFG0003,是一个自制的成品.它的物料主数据的质量管理视图里激活了04检验类型,按设置是在工单入库的时候触发检验批的.如下图示: 'Cont ...

  10. JavaScript 闭包的详细分享(三种创建方式)(附小实例)

    JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...

最新文章

  1. 将数据库查询结果导出成Excel表格
  2. iOS 开发中需要注意的小地方
  3. OpenCV摄像机videocapture camera的实例(附完整代码)
  4. ActiveX技术在WEB页上的应用[转载]
  5. 1008 Elevator (20 分)_13行代码AC
  6. 软考计算机基础:存储系统
  7. 信息学奥赛一本通 1116:最长平台 | OpenJudge NOI 1.9 12:最长平台 | 洛谷 B2097 最长平台
  8. 安装配置Greenplum
  9. java比较两个时间年月份的大小
  10. java中的回调函数
  11. macos server 恢复安装_Sinter:一款针对macOS的用户模式应用程序授权系统
  12. javaweb网上鞋店
  13. Ubuntu常用命令汇总
  14. android 服务开机启动慢,Android App启动慢原因
  15. IAR For ARM 历史版本下载链接
  16. Silvaco学习笔记(一)毕设相关
  17. 文件上传漏洞靶场upload-labs学习(pass11-pass15)
  18. 软件著作权(软著)申请之六大坑
  19. 喊苦喊累的程序员们,看看日本人是怎么加班的。
  20. TUANDUIZUOYE

热门文章

  1. ffmpeg学习之路·番外篇之音视频分析常用软件介绍与分享
  2. 【教程】如何在C#中创建PDF417条码
  3. 身份证号码 js验证
  4. 互联网创新创业大赛优秀范例_【互联网+大学生创新创业大赛项目计划书】创新创业大赛作品范例...
  5. 金融理财软件测试项目,大学生创新创业大赛金融理财项目创业计划书18-23-879(15页)-原创力文档...
  6. Matrix Calculus Reference Links
  7. linux装流量宝,流量宝下载_流量宝官方APP手机最新版本下载安装 - 风云下载
  8. java jni 傻瓜教程
  9. 微信公众号定位显示EC-01G模组+STM32F103
  10. html 嵌入编辑excel 开源_网页中嵌入Excel控件