萱草|基于C++11,介绍启动线程的五种方式
程序开发过程中 , 经常会面对各种各样的需求场景 , 如果采用单线程的处理方式 , 那么是很难满足要求 , 所以 , 需要采用多线程的方式来处理 , 而这就涉及到启动线程的方式 。
本文将首先说明启动线程的五种方式 , 然后再分析五种方式的优缺点 , 最后通过一个示例来说明如何将线程运用到实际的场景中 , 并总结五种启动线程的特性 。
本文插图
函数指针方式启动线程是最原始、最基础的方式 。 定义实现线程的处理函数ThreadFunction , 然后启动线程的时候 , 将函数指针传达给线程类的构造函数 。
本文插图
启动线程之后 , 打印了如下信息 , 说明线程启动之后 , 调用了线程处理函数 。
本文插图
第二种启动线程的方式是采用函数对象的形式 , 首先创建类ThreadOpeartor , 然后该类重载operator()运算符 , 最后以仿函数的形式作为线程的参数传递给线程来启动 。
本文插图
同样的 , 运行程序之后 , 串口上可以查看到如下信息 , 说明函数对象方式启动线程是生效的 。
本文插图
第三种启动线程的方式是lambda函数形式 , lambda函数即匿名函数 , 它作为线程的参数来启动线程 。
本文插图
编译运行程序之后 , 也可以确认线程启动的时候 , 调用了lambda函数 。
本文插图
【萱草|基于C++11,介绍启动线程的五种方式】第四种启动线程的方式是类函数指针形式 , 先在类成员之中定义类成员函数 , 然后以函数指针作为参数来启动线程 。
本文插图
从运行结果看 , 启动的线程成功调用了类的成员函数 。
本文插图
第五种启动线程的方式是stb::bind形式 ,首先是类成员函数作为stb::bind的参数 ,然后stb::bind再作为线程参数来启动线程 。
本文插图
编译成功之后 , 运行程序的结果如下 , 这也说明std::bind方式启动线程是可行的 。
本文插图
函数指针启动线程的方式是一种比较老的方式 , linux系统中pthread库是支持的 , 是属于面向过程的思想 , 如果使用的系统不支持C++11 ,那么可以采用这种方式 。
函数对象启动线程的方式可以在类内部定义更多的细节 , 比如定义成员变量 , 将更多的逻辑处理细节进行封装 。
lambda函数启动线程的方式是代码比较简洁 , 由于函数是内嵌形式 , 可读性也比较好 , 它适用于线程处理函数的逻辑不是很复杂的场景 。
类函数指针启动线程的方式 , 线程的处理函数是属于类 , 所以需要注意其生命周期 。
std::bind启动线程的方式 , 它可以与std::function结合起来 , 实现函数回调功能 。
本节将采用函数对象的形式启动线程 , 说明如何应用到实际的应用中 。
假设有不同的命令 , 需要在线程中执行 , 首先实现命令基类
本文插图
然后创建执行命令类JWorkThread, 并重载operator() 运算符, 并且内部执行命令 。
本文插图
接着现在有一个类JRunCmd继承基类JCommand , 则调用方式如下所示
本文插图
本文主要说明了五种启动线程的方式 , 并且说明了其特点 , 最后举了一个线程应用的场景 。 但是 , 实际使用过程中 , 需要结合具体的场景来使用对应的线程启动方式 。
- 函数指针方式:定义普通函数
- 函数对象方式:重载operator()运算符
- Lambda函数方式:匿名函数
- 类函数指针的方式:对象函数指针
- std::bind的方式: 实际上也是对象函数指针
推荐阅读
- 量子门|利用超导量子比特实现基于非绝热几何相的量子门
- rnai|新药速递:首个基于RNAi疗法的新药ARC-520结果出炉!
- 2020WNEVC创新技术解读 | 基于昇腾AI的自动驾驶云服务技术
- 最新消息|约翰·传奇和娜塔莉·波特曼投资的MycoWorks可制造基于真菌的生物材料
- Python 俄罗斯方块, 基于pyqt5实现俄罗斯方块 --pyqt5 进阶
- 计算机视觉工坊|一文带你了解基于视觉的机器人抓取自学习(Robot Learning)
- 微软|微软认为基于短信的多因素认证机制并不安全 应该被放弃
- 昨晚,苹果重新定义了电脑!基于ARM架构的M1芯片久违的macOS Big Sur旧瓶装新酒的三款Mac电脑
- |基于Android 11:OPPO Ace2迎ColorOS 11正式版升级
- 区块链|日本Layer X实验室宣布开发基于区块链的电子投票协议
