C++学习之路: 线程封装(基于对象编程)

引言:

此次我们重新封装线程, 采用基于对象编程的方式,不用于面向对象编程中重定义虚函数的方式,这里我们用回调函数的方式。

Thread.h

 1 #ifndef THREAD_H_
 2 #define THREAD_H_
 3 
 4 #include <boost/noncopyable.hpp>
 5 #include <functional>
 6 #include <pthread.h>
 7 
 8 class Thread : boost::noncopyable
 9 {
10 public:
11     typedef std::function<void ()> ThreadCallback;
12 
13     Thread(ThreadCallback callback);
14     ~Thread();
15 
16     void start();
17     void join();
18 
19     static void *runInThread(void *);
20 
21 private:
22     pthread_t threadId_;
23     bool isRunning_;
24     ThreadCallback callback_; //回调函数
25 };
26 
27 
28 
29 #endif //THREAD_H_

 

可以看到没有重定义虚函数, 而是设置了一个函数适配器, 用于保存我们想要的业务逻辑。

直接用 静态函数 runInThread 调用 callback_即可。

 

Thread.cpp

 1 #include "Thread.h"
 2 
 3 Thread::Thread(ThreadCallback callback)
 4 : threadId_(0),
 5   isRunning_(false),
 6   callback_(std::move(callback))
 7 {
 8 
 9 }
10     
11 Thread::~Thread()
12 {
13     if(isRunning_)
14     {
15         //detach
16         pthread_detach(threadId_);
17     }
18 }
19 
20 void Thread::start()
21 {
22     pthread_create(&threadId_, NULL, runInThread, this);
23     isRunning_ = true;
24 }
25 void Thread::join()
26 {
27     pthread_join(threadId_, NULL);
28     isRunning_ = false;
29 }
30 
31 void *Thread::runInThread(void *arg)
32 {
33     Thread *pt = static_cast<Thread*>(arg);
34     pt->callback_(); //调用回调函数
35 
36     return NULL;
37 }

以上 有几点经验处理, Google推荐 当Thread 这个类析构时,如果线程还没有执行完, 那么就detach。

并设置一个标志位 bool isRunning 标志线程是否启动。

 

测试代码

 1 #include "Thread.h"
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 using namespace std;
 5 
 6 void foo()
 7 {
 8     while(1)
 9     {
10         printf("foo\n");
11         sleep(1);
12     }
13 }
14 
15 
16 
17 int main(int argc, char const *argv[])
18 {
19     Thread t(&foo);
20 
21     t.start();
22     t.join();
23 
24     return 0;
25 }

可以看到, 当用基于对象编程时, 不需要在定义用户自己的类了, 只需在主函数传入一个函数适配器即可。 具体函数类型可以用bind来实现。

 

测试代码2

 1 #include "Thread.h"
 2 #include <stdio.h>
 3 #include <unistd.h>
 4 using namespace std;
 5 
 6 class Foo
 7 {
 8 public:
 9     void foo(int i)
10     {
11         while(1)
12         {
13             printf("foo %d\n", i++);
14             sleep(1);
15         }
16     }
17 };
18 
19 
20 
21 int main(int argc, char const *argv[])
22 {
23     Foo f;
24     int i = 34;
25     Thread t(bind(&Foo::foo, &f, i));
26 
27     t.start();
28     t.join();
29 
30     return 0;
31 }

 

对于 类的成员函数 同理使用 大杀器bind

 

转载于:https://www.cnblogs.com/DLzhang/p/4023369.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员崩溃的40个瞬间!!!

全世界只有3.14 % 的人关注了爆炸吧知识说到程序员&#xff0c;在外界眼里&#xff0c;他们是掌控代码的大神&#xff0c;他们是改变世界的王者。其实程序员的工作不容易&#xff0c;不信&#xff0c;就来看看程序员崩溃的各种瞬间——01公司实习生找bug02在调试时&#xff0c;…

是否可以将 json 反序列化为 dynamic 对象?

咨询区 jswanson&#xff1a;是否有方法可以将 json 反序列化为 dynamic 对象&#xff0c;如果可以实现的话&#xff0c;那我就可以省去很多冗余类。回答区 Tom Peplow&#xff1a;如果你用 Json.NET 的话&#xff0c;那就非常简单了。dynamic stuff JsonConvert.DeserializeO…

java web请求字符串处理_java web工作常用技能篇(三)-封装复杂请求对象2

前言&#xff1a;在各类网站论坛上,没有找到与工作比较贴切的技能,所以特此写一些对刚步入工作或者工作中没有重视的技能与问题,各位大牛请及时关闭文章.ps1&#xff1a;文中所有标点都是英文的,看官请不要在意.为了便于平时敲代码,所以中文输入法也默认了英文标点(防止各类因为…

Matlab学习------------带有右键菜单的GUI学习实例

实例步骤&#xff1a; 须要设置UIContextMenu&#xff0c;否则点击右键不显示。 右键点击第一个菜单之后&#xff1a;&#xff08;在菜单中加入对应的回调函数&#xff09; function r1_Callback(hObject, eventdata, handles) % hObject handle to r1 (see GCBO) % eventda…

多方位助您快速精准查阅文献和发文章的利器——X-MOL

全世界只有3.14 % 的人关注了爆炸吧知识无论您看文献的习惯是怎样的&#xff0c;X-MOL都有一种为您节省时间的功能:01根据参考文献一键直达全文—— X-MOL文献直达复制文章题录信息&#xff08;如“PNAS, 2020, 117, 6771-6776”&#xff09;或DOI&#xff0c; 粘贴到X-MOL首页…

关于Session的使用和优化

优点 如果要在诸多Web页间传递一个变量&#xff0c;那么用Session变量要比通过QueryString传递变量可使问题简化。 要使WEb站点具有用户化&#xff0c;可以考虑使用Session变量。你的站点的每位访问者都有用户化的经验&#xff0c;基于此&#xff0c;随着LDAP和诸如MS Site Ser…

ASP.NET Core端点路由中三种让人困惑的路由函数

早先提及了端点路由app.UseEndpoints, 端点路由强调的是端点和路由&#xff0c;其核心目的是将请求落地点与路由寻址方式解耦。《ASP.NET Core端点路由作用原理》这里面有几个容易混淆的函数•MapControllerRoute•MapDefaultControllerRoute•MapControllers有什么不同&#x…

java 写入环境变量_Java环境变量配置 - import_key的个人空间 - OSCHINA - 中文开源技术交流社区...

Java 环境变量和路径在 Solaris 系统上&#xff0c;必须先设置 JAVA_HOME 和 PATH 环境变量&#xff0c;Sun Management Center 3.6 安装向导、设置向导和 Java 控制台才能正常工作。与此类似&#xff0c;要使 Sun Management Center Java 控制台在 Microsoft Windows 上正常工…

电脑温度检测软件哪个好_实时检测Mac电脑的温度

想要实时检测Mac电脑的温度吗&#xff1f;那就来试试这款Temperature Gauge Pro吧。Temperature Gauge Pro又名为TG Pro&#xff0c;是一款专业的Mac实时温度的软件。这款软件能够帮助大家进行Mac中的风扇控制、温度监控和硬件诊断等功能&#xff0c;帮助大家更好的维护自己电脑…

【转】SQL SERVER 存储过程学习笔记

原文地址&#xff1a;http://www.cnblogs.com/nina-piaoye/archive/2006/09/18/507183.html 将常用的或很复杂的工作&#xff0c;预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命…

我一哥们,在东莞和五名女孩被抓了.....

1 人在东莞&#xff0c;与五名女子一起被抓现已失联▼2 羊&#xff1a;我有一句MMP&#xff0c;不知当讲不当讲▼3 这是在上网查下一步应该怎么做&#xff1f;▼4 人生处处是惊喜▼5 看似平平无奇的棉签▼6 陈独秀同学&#xff0c;有话你站在桌子上说▼7 现在的玩具都这…

取奇偶数

#取奇数……1..20|?{$_ % 2 -eq 1} #取偶数……1..20|?{$_ % 2 -eq 0} #取1、4、7、10……1..20|?{$_ % 3 -eq 1}转载于:https://www.cnblogs.com/dreamer-fish/p/4024198.html

【成长点滴】对SMART原则的一些粗浅理解

【成长点滴】对SMART原则的一些粗浅理解 以下解释来自百度百科 “所谓SMART原则&#xff0c;即是&#xff1a; S&#xff1a;(Specific) 目标要清晰、明确&#xff0c;让考核者与被考核者能够准确的理解目标&#xff1b;M&#xff1a;(Measurable) 目标要量化&#xff0c;考核时…

太神奇了!使用C#实现自动核验健康码:(2)OCR识别

前言上次太神奇了&#xff01;使用C#实现自动核验健康码&#xff1a;(1)二维码识别&#xff0c;我们已经实现了识别健康码的颜色&#xff0c;但是健康码的内容不包含时间属性。那么使用图片就可以通过检查&#xff0c;肯定是不合适的。因此&#xff0c;我们还需要读出健康码上方…

多个数求平均数java_[分享]求任意个数的平均数!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼自己编的小程序:import java.util.*;class notsure{private double numlist[];public notsure(double ... list)/*此数组个数可任意.*/{numlistlist;}public double doit(){double result0;if(numlist.length!0){int sum0;for(doub…

bo耳机h5使用说明_真香时刻·性价比大旗——红米AirDots2 TWS真无线耳机体验测评...

TWS真无线耳机经过了这几年的发展&#xff0c;在音质、连接稳定性、易用性等方面都有了长足的发展&#xff0c;价格也从最早的上千元下探到了数百元&#xff0c;真正从发烧玩家的尝鲜设备变成了大众的日常用品。我用过的TWS耳机不下数十个&#xff0c;但即使是如Bose、B&O等…

卖股技巧

买对股票只完成投资过程的一半或更少&#xff0c;接下来就是跟踪个股&#xff0c;并在股价大幅上涨之后卖掉股票&#xff0c;所以如何卖股票至关重要。笔者通过长期的研究&#xff0c;总结出了卖股的五大技巧。 技巧一&#xff1a;低于买入价8&#xff05;-9&#xff05;坚决止…

这个行业人才紧缺,就业率超高!未来大有可为!

全世界只有3.14 % 的人关注了爆炸吧知识近几年&#xff0c;伴随人工智能的兴起&#xff0c;数据分析师、算法工程师等职业也迎来需求高峰。时下人工智能是炙手可热的一个行业&#xff0c;2015-2018年&#xff0c;中国人工智能产业市场规模从112.4亿元增长至415.5亿元&#xff0…

多线程(C++)临界区Critical Sections

一 、Critical Sections&#xff08;功能与Mutex相同&#xff0c;保证某一时刻只有一个线程能够访问共享资源&#xff0c;但是不是内核对象&#xff0c;所以访问速度比Mutex快&#xff0c;但是没有等待超时的功能&#xff0c;所以有可能导致死锁&#xff0c;使用要小心&#xf…

由社区推动的 .NET 6 新 API

原文&#xff1a;bit.ly/3ykXfgJ作者&#xff1a;David Fowler翻译&#xff1a;精致码农-王亮.NET 6 即将到来&#xff0c;我想分享一些我最喜欢的 .NET 和 ASP.NET Core 中的新 API&#xff0c;你一定会喜欢&#xff0c;因为它们是由我们优秀的 .NET 开发者社区推动的。让我们…