【linux多线程】c++多线程的几种创建方式
序言
之前的文章介绍了 进程和线程的基本概念,以及 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++多线程的几种创建方式相关推荐
- Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题
Java多线程:多线程同步安全问题的 "三" 种处理方式 ||多线程 "死锁" 的避免 || 单例模式"懒汉式"的线程同步安全问题 每博一文 ...
- java中字符串的创建_【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- 线程的三种创建方式以及代码实现
线程和进程的概念 一个进程可以有多个线程 程序:是指令和数据的有序集合(静态的) 进程:是执行程序的一次执行过程(动态的),是系统资源分配的单位.在操作系统中运行的程序就是进程. 通常在一个进程中可以 ...
- 单例对象会被jvm的gc时回收吗_设计模式专题02-单例五种创建方式
单例五种创建方式(下一篇:工厂模式) 什么是单例 保证一个类只有一个实例,并且提供一个访问该全局访问点 单例应用场景 1. Windows的Task Manager(任务管理器)就是很典型的单例模式( ...
- Java线程池的四种创建方式
Java线程池的四种创建方式 Java使用Thread类来表示线程,所有的线程都是Thread类或者是他的子类.Java有四种方式来创建线程. (1)继承Thread类创建线程 (2)实现Runnab ...
- 【无标题】单例模式的两种创建方式:饿汉式和懒汉式
这里写自定义目录标题 单例模式的两种创建方式:饿汉式和懒汉式 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂 ...
- 线程池概念、线程池作用、线程池的四种创建方式
线程池 1.1.什么是线程池? 线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程.线程池中线程的数量通常完全取决于可用内存数量和应用程 ...
- 线程的三种创建方式和他们的优缺点
文章目录 一.线程的三种创建方式 1.继承Thread 2.实现Runable接口 3.实现Callable接口 二.三种创建方式的优缺点 1.使用Runnable接口比使用继承Thread的优势 2 ...
- SAP QM 04类型检验批的另外一种创建方式
SAP QM 04类型检验批的另外一种创建方式 物料号:ZFG0003,是一个自制的成品.它的物料主数据的质量管理视图里激活了04检验类型,按设置是在工单入库的时候触发检验批的.如下图示: 'Cont ...
- JavaScript 闭包的详细分享(三种创建方式)(附小实例)
JavaScript闭包的详细理解 一.原理:闭包函数--指有权访问私有函数里面的变量和对象还有方法等:通俗的讲就是突破私有函数的作用域,让函数外面能够使用函数里面的变量及方法. 1.第一种创建方式 ...
最新文章
- 将数据库查询结果导出成Excel表格
- iOS 开发中需要注意的小地方
- OpenCV摄像机videocapture camera的实例(附完整代码)
- ActiveX技术在WEB页上的应用[转载]
- 1008 Elevator (20 分)_13行代码AC
- 软考计算机基础:存储系统
- 信息学奥赛一本通 1116:最长平台 | OpenJudge NOI 1.9 12:最长平台 | 洛谷 B2097 最长平台
- 安装配置Greenplum
- java比较两个时间年月份的大小
- java中的回调函数
- macos server 恢复安装_Sinter:一款针对macOS的用户模式应用程序授权系统
- javaweb网上鞋店
- Ubuntu常用命令汇总
- android 服务开机启动慢,Android App启动慢原因
- IAR For ARM 历史版本下载链接
- Silvaco学习笔记(一)毕设相关
- 文件上传漏洞靶场upload-labs学习(pass11-pass15)
- 软件著作权(软著)申请之六大坑
- 喊苦喊累的程序员们,看看日本人是怎么加班的。
- TUANDUIZUOYE
热门文章
- ffmpeg学习之路·番外篇之音视频分析常用软件介绍与分享
- 【教程】如何在C#中创建PDF417条码
- 身份证号码 js验证
- 互联网创新创业大赛优秀范例_【互联网+大学生创新创业大赛项目计划书】创新创业大赛作品范例...
- 金融理财软件测试项目,大学生创新创业大赛金融理财项目创业计划书18-23-879(15页)-原创力文档...
- Matrix Calculus Reference Links
- linux装流量宝,流量宝下载_流量宝官方APP手机最新版本下载安装 - 风云下载
- java jni 傻瓜教程
- 微信公众号定位显示EC-01G模组+STM32F103
- html 嵌入编辑excel 开源_网页中嵌入Excel控件