基于C++11,介绍启动线程的五种方式

本文将首先说明启动线程的五种方式,然后再分析五种方式的优缺点,最后通过一个示例来说明如何将线程运用到实际的场景中,并总结五种启动线程的特性。 2020-09-23 16:31:38 C++C++11启动线程 JavaScript 中的函数式编程:函数,组合和柯里化 面向对象编程和函数式编程是两种非常不同的编程范式,它们有自己的规则和优缺点。 2020-09-23 16:07:52 JavaScript函数柯里化 啥?Python竟然也可以制作萌萌的手绘图表 大家可能已经习惯了用Matplotlib和seaborn来制作不同的图表,但是今天要介绍一个非常酷的Python手绘风格的可视化包:cutecharts。

本文将首先说明启动线程的五种方式,然后再分析五种方式的优缺点,最后通过一个示例来说明如何将线程运用到实际的场景中,并总结五种启动线程的特性。

程序开发过程中,经常会面对各种各样的需求场景,如果采用单线程的处理方式,那么是很难满足要求,所以,需要采用多线程的方式来处理,而这就涉及到启动线程的方式。

本文将首先说明启动线程的五种方式,然后再分析五种方式的优缺点,最后通过一个示例来说明如何将线程运用到实际的场景中,并总结五种启动线程的特性。

[[343486]]

一、函数指针方式

函数指针方式启动线程是最原始、最基础的方式。定义实现线程的处理函数ThreadFunction,然后启动线程的时候,将函数指针传达给线程类的构造函数。

基于C++11,介绍启动线程的五种方式

启动线程之后,打印了如下信息,说明线程启动之后,调用了线程处理函数。

基于C++11,介绍启动线程的五种方式

二、函数对象方式

第二种启动线程的方式是采用函数对象的形式,首先创建类ThreadOpeartor,然后该类重载operator()运算符,最后以仿函数的形式作为线程的参数传递给线程来启动。

基于C++11,介绍启动线程的五种方式

同样的,运行程序之后,串口上可以查看到如下信息,说明函数对象方式启动线程是生效的。

基于C++11,介绍启动线程的五种方式

三、lambda方式

第三种启动线程的方式是lambda函数形式,lambda函数即匿名函数,它作为线程的参数来启动线程。

基于C++11,介绍启动线程的五种方式

编译运行程序之后,也可以确认线程启动的时候,调用了lambda函数。

基于C++11,介绍启动线程的五种方式

四、类函数指针方式

第四种启动线程的方式是类函数指针形式,先在类成员之中定义类成员函数,然后以函数指针作为参数来启动线程。

基于C++11,介绍启动线程的五种方式

从运行结果看,启动的线程成功调用了类的成员函数。

基于C++11,介绍启动线程的五种方式

五、std::bind方式

第五种启动线程的方式是stb::bind形式, 首先是类成员函数作为stb::bind的参数, 然后stb::bind再作为线程参数来启动线程。

基于C++11,介绍启动线程的五种方式

编译成功之后,运行程序的结果如下,这也说明std::bind方式启动线程是可行的。

基于C++11,介绍启动线程的五种方式

六、启动方式优缺点

函数指针启动线程的方式是一种比较老的方式,linux系统中pthread库是支持的,是属于面向过程的思想,如果使用的系统不支持C++11, 那么可以采用这种方式。

函数对象启动线程的方式可以在类内部定义更多的细节,比如定义成员变量,将更多的逻辑处理细节进行封装。

lambda函数启动线程的方式是代码比较简洁,由于函数是内嵌形式,可读性也比较好,它适用于线程处理函数的逻辑不是很复杂的场景。

类函数指针启动线程的方式,线程的处理函数是属于类,所以需要注意其生命周期。

std::bind启动线程的方式,它可以与std::function结合起来,实现函数回调功能。

七、线程应用场景

本节将采用函数对象的形式启动线程,说明如何应用到实际的应用中。

假设有不同的命令,需要在线程中执行,首先实现命令基类

基于C++11,介绍启动线程的五种方式

然后创建执行命令类JWorkThread, 并重载operator() 运算符, 并且内部执行命令。

基于C++11,介绍启动线程的五种方式

接着现在有一个类JRunCmd继承基类JCommand,则调用方式如下所示

基于C++11,介绍启动线程的五种方式

八、总结

本文主要说明了五种启动线程的方式,并且说明了其特点,最后举了一个线程应用的场景。但是,实际使用过程中,需要结合具体的场景来使用对应的线程启动方式。

  • 函数指针方式:定义普通函数
  • 函数对象方式:重载operator()运算符
  • Lambda函数方式:匿名函数
  • 类函数指针的方式:对象函数指针
  • std::bind的方式: 实际上也是对象函数指针

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月5日 13:31
下一篇 2023年5月5日 13:31

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信