多线程Thread类不同封装实现

boost库封装Thread 阅读详情
  • 多线程Thread类实现
    1.C语言实现方式:通过建立多个全局线程回调函数实现
    2.面向对象实现方式:通过多态特性实现,虚函数在派生类中不同的行为方式
    3.基于对象实现方式:通过boost::function和bind实现
  • - 对于Linux线程创建方式:
int pthread_create(pthread_t *restrict thread,  
        const pthread_attr_t *restrict attr,  
        void *(*start_routine)(void*), void *restrict arg);  

参数1.线程ID
参数2.线程属性
参数3.线程回调函数
参数4.回调函数

  1. C语言实现线程方式:

        通过建立全局线程回调函数实现,对于多个线程多个 不同任务需要建立多个全局函数,例子
    
void threadFunction1(void* arg)
{
    printf("child thread 1\n");
    pthread_exit(NULL);
}
void threadFunction2(void* arg)
{
    printf("child thread 2\n");
    pthread_exit(NULL);
}
int main(){
    pthread_t thread1;
    pthread_t thread2;
    pthread_create(&thread1,NULL,threadFunction1,NULL);
    pthread_create(&thread2,NULL,threadFunction2,NULL);
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    return 0;
} 
  1. 面向对象封装方式

    虚函数在派生类中不同的行为方式
    
class Thread
{
public:
    Thread(){}
    virtual ~Thread(){}
    void start()
    {
        pthread_create(&_thread,NULL,thread_rountine,this);
    }
    void join()
    {
        pthread_join(_thread,NULL);
    }
private:
static void* thread_rountine(void* arg)
{
    // 不同的线程调用同样的thread_rountine函数,this指针指向不同的线程派生类,执行派生类中的run行为
    Thread* thread = static_cast<Thread*>(arg);
    thread->run();
    return NULL;
}
virtual run()=0;
pthread_t _thread;
};

在prthread_create中为什么不能传递类的成员函数,使用静态的成员函数,因为pthread_create的参数三是一个普通的函数,而类的成员函数隐含传递一个this指针。
3. 基于对象封装方式(muduo库实现方式 boost::function/bind)

    通过boost::function和bind实现
class Thread
{
public:
    typedef boost::function<void ()> ThreadFunc;
    explicit Thread(const ThreadFunc& func):_func(func){}
    ~Thread(){}
    void start(){pthread_create(&_thread,NULL,thread_rountine,this);}
    void join(){pthread_join(_thread,NULL);}
private:
    ThreadFunc _func;
    pthread_t _thread;
    void run()
    {
        _func();
    }
    static void* thread_rountine(void* arg)
    {
        // boost::function类似于一种函数指针的声明,boost::bind类似于绑定一个函数
        // 对于不同线程执行不同的行为时,只需要通过boost::bind改变即可实现。
        Thread* thread = static_cast<Thread*>(arg);
        thread->run();
        return NULL;
}
};
class Foo
{
public:
void MemberFun()
{
    cout<<"child thread1"<<endl;
}
void MemberFun1(int count)
{
    cout<<"child thread2:"<<count<<endl;
}
};
int main()
{
    Foo foo1();
    Foo foo2();
    Thread t(boost::bind(&Foo::MemberFun, &foo));
    Thread t1(boost::bind(&Foo::MemberFun1,&foo2,3));
}
  1. 两种方式比较

    个人观点:
    继承实现的方式耦合性强,当功能扩展时,都需要建立新的派生类实现run方法
    对于基于对象方式来说,耦合性低,对于功能扩展只需要编写一个函数就可以了,扩展性强

【多线程】Thread类 本期主要讲解: 1.Java 中如何进行多线程编程? 2.简单使用多线程 3.start和run的区别 4. jconsole 工具 5.Java中创建线程的写法 6.Thread类方法介绍 6.1构造方法 6.2 Thread类常见属性 6.3什么是守护线程? 6.5什么情况线程才是存活的? 6.6什么是线程中断? 阅读详情

相关推荐

Ubuntu 20.04 LTS下5分钟搞定ONLYOFFICE协作空间社区版(Docker版保姆级教程)

本文提供了一份在Ubuntu 20.04 LTS系统上,通过Docker快速部署ONLYOFFICE协作空间社区版的保姆级教程。内容涵盖从系统准备、Docker环境搭建,到执行自动化安装脚本、完成Web初始化的全流程,并详细说明了部署后的安全配置、数据备份及基本运维要点,帮助用户高效构建私有、安全、可控的团队文档协作平台。

weixin_28826961的博客 261

将boost::thread的某些简单功能封装成类java线程的想法。

    最近对c++有些兴趣,主要是想自己写个数据库来玩玩。没想到用c++写东西还真的是一个字:难!(个人感觉,相较于java)    听说boost库很不错,最主要的是,我看中了他的可移植性,就下下来试验下。嘿嘿,是个不错的东东,就是对用惯java的我来说,貌似不是很友好。我怒了,花一上午时间封装了它的线程库,至于效率啊,性能什么的,我就先不管了。可以继承该类重写run方法来创建一个新的线程

myiner的专栏 3154

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 482

C++多线程编程

C++的多线程不同于C语言的多线程,对于我这个从C转向C++的来说更是觉得很难理解;来新公司的这段时间也是一直在思考这方面的事情,近期一直在检查程序中死锁的问题;就总结以下最近对于C++多线程编程的心得吧。       C++的多线程主要体现在两方面,一方面是对于全局数据的线程同步。我们看下面的实例       首先我们封装一个Thread类 Thread.h 文件 #if

u014511737的专栏 571

RedVQA:轻量级无参考视频质量评估算法原理与工程实践

视频质量评估是计算机视觉领域的关键技术,旨在通过算法自动量化视频的观看体验。其核心原理在于模拟人眼视觉系统,从像素数据中提取并融合空域和时域特征,以预测主观质量分数。这项技术的价值在于,它能自动化处理海量视频内容的质量监控,为流媒体服务、移动设备影像优化等场景提供关键指标。无参考视频质量评估作为该领域的前沿方向,无需原始无损视频作为参考,更贴合实际应用。本文以RedVQA项目为例,深入剖析了如何利用轻量化的深度网络架构,如MobileNetV3,结合高效的时空特征融合模块,在保证评估精度的同时,大幅降低计算

weixin_28698129的博客 575

通讯软件002——快速使用modscan进行modbus调试

快速使用modscan进行modbus调试

zhouwl72的博客 1032

Thread类的封装

C编程风格:注册全局函数到网络库,然后通过函数指针进行回调面向对象风格:用一个类继承一个抽象类,实现接口的具体业务逻辑基于对象风格:用一个类包含一个具体类对象,在构造函数中用bind来注册成员函数。...

guicaifjz的博客 1045

Mamba与iTransformer融合:时间序列预测中的曼巴注意力机制创新实践

本文探讨了Mamba与iTransformer融合在时间序列预测中的创新实践,重点介绍了曼巴注意力机制的设计与优势。通过双路径信息流设计,该方案在保持O(n)复杂度的同时,显著提升了预测精度和训练效率。实验证明,混合架构在电力负荷、气象数据等多变量长序列场景中表现优异,预测误差降低至0.083,内存占用仅4.2GB。

weixin_29292535的博客 219

用std::thread替换实现boost::thread_group

thread_group是boost库中的线程池类,内部使用的是boost::thread。 随着C++ 11标准的制定和各大编译器的新版本的推出(其实主要是VS2012的推出啦……),本着能用标准库就用标准库的指导原则,决定把项目中多线程相关的部分代码从boost::thread迁移到std::thread。 thread的迁移本身很简单,毕竟stl的很多功能是直接从boost...

weixin_30535843的博客 446

微信小程序- 云开发上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。(小程序上传部署云函数提示错误,开发控制台中的云函数没有删除,详细排查)

微信小程序——云函数上传失败,微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。微信小程序上传云函数失败,微信小程序云开发|Error: ResourceNotFound.FunctionName, FunctionName 指定的资源不存在。微信云开发报错(Error: ResourceNotFound.FunctionName,微信小程序云函数报错,上传云函数 sum 失败 Error:,上传部署我们的云函数 2. 报错 错误信息

🏆 前端领域优质创作者 4315

100 道大数据开发技术原理与实战面试宝典(必过答案详细解析)I

在数字化浪潮席卷全球的今天,大数据开发工程师已成为企业数字化转型的核心力量。无论是互联网巨头的用户行为分析,还是金融机构的风险控制,亦或是智慧城市的数据中枢,都离不开大数据技术的支撑。然而,面对BAT等头部企业严格的面试要求,候选人不仅需要掌握扎实的理论基础,更需具备将技术落地的实战能力。本文基于历年高频面试题与企业真实场景需求,梳理100道必考题目,涵盖基础概念、框架原理、算法设计、性能优化等核心领域,助你构建完整的知识体系,从容应对面试挑战。

AI天才研究院 1386

【多线程】在Java中使用多线程

创建线程、Thread 类及常⻅⽅法、线程的核心操作、线程的状态

HuTool的博客 751

win7 vs2012+wdk8.0 搭建wdf驱动开发环境

开发环境搭建: 系统:win7 x64 工具:vs2012 + WDK8.0 插件:wdfcoinstaller.msi (1)先安装vs2012,再安装wdk8.0,这样在打开vs2012时可以创建windows drivers类型的工程。 注:vs2012不能安装wdk8.1,wdk8.1必须安装在vs2013上 下载链接:http://msdn.microsoft.com/zh-cn/win...

技术联盟 5342

java中多线程创建的三种方式

Java多线程创建的三种方式:1)继承Thread类,重写run方法(简单但扩展性差);2)实现Runnable接口,重写run方法(扩展性强,推荐使用);3)实现Callable接口,配合FutureTask获取返回值(可获取执行结果)。Thread类提供常用方法如start()、getName()、sleep()等控制线程执行。其中Runnable方式最常用,因其避免了单继承限制,具有更好的扩展性。Callable方式适合需要获取线程执行结果的场景。

qq_65392714的博客 705

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【C++11新特性】多线程

主要通过RAII的方式,对其管理的互斥量进行了封装,在需要加锁的地方,只需要用上述介绍的任意互斥体实例化一个lock_guard,调用构造函数成功上锁,出作用域前,lock_guard对象要被销毁,调用析构函数自动解锁,可以有效避免死锁的问题。在这段代码中,t1和t2两个线程对同一个信号量进行++操作,由于底层的++操作的汇编代码是多行的,可能会导致x的数值混乱,因为对于一个++操作来说,它底层的汇编大概分为三步,分别是ld,++,sd。但如果加在里面虽然是并行运行,这样频繁的加锁解锁是需要消耗资源的。

分享学习的知识,记录我的技术成长道路 1082

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java多线程编程基础

阅读本文之后, 就能编写你的第一个多线程程序啦,快来试试吧

2301_80313139的博客 857

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【多线程】Thread 类及常见方法

1.Thread 类 在Java标准库中,提供有一个Thread,来表示/操作线程。 Thread 类也可以视为Java 标准库提供的API。 创建好的 Thread 实例,其实和操作系统中的线程是一一对应的关系。 操作系统,提供了一组关于线程API(C语言风格),Java对于这组API进一步封装了,就成了Thread类 2.创建线程 2.1继承Thread 类 通过Thread 类创建线程,最基本的做法就是创建子类,继承自Thread ,并且重写run方法 (1)继承Thread 来创建一

m0_60494863的博客 6289

Java多线程之线程的创建与Thread类的使用

本篇文章介绍java多线程中Thread类的使用以及有关线程对象创建和常用方法。

未见花闻的博客 3170

JAVA-Thread类实现多线程

如果某个线程在执行过程中,能够阻止进程结束,此时这个线程就是“前台线程”,只要当进程中的所有前台线程都结束那么这个进程才可以结束。try {});t1.start();// 是否为后台线程如果这个线程执行过程中,不能阻止进程结束(虽然线程在执行着,但是进程要结束了,此时这个线程也会随之被带走),这样的线程就是“后台线程”。try {});//设置线程为后台线程,需要在start之前设置t1.start();

Lizhihao_的博客 1283

【多线程】初步认识Thread类及其应用

操作系统针对多个线程的执行,是一个“随机调度”,抢占式执行的过程。线程的调度执行是随机的,我们无法确定两个线程的调度顺序,但是可以控制谁先结束谁后结束。 线程等待就是确定两个线程的结束顺序,通过让后结束的线程等待先结束的线程执行,进入阻塞状态,直到先结束的线程执行完毕,此时阻塞解除,后结束的线程开始执行。这样就能使两个线程的结束顺序得以确定

acm_pn的博客 1233

【多线程】Thread类及其基本用法

本期内容主要介绍Thread类,以及其基本用法。

爱编程爱运动的博客 5731

【JavaEE】Java中的多线程 (Thread类)

Java中的多线程 - Thread类

做梦都想要三十万年薪~ 4679

多线程中继承Thread 类和实现Runnable 接口的区别

网上看了很多多线程里继承Thread 类和实现Runnable 接口的区别,感觉不是很清晰,说下我的观点吧 区别一 创建线程的方式不同: 实现Runnable接口是代理模式,交给Thread()类去start; 如:new Thread(new MyRunnable(),"线程名").start(); 一个类继承Thread类以后本身就是一个线程对象,可以直接start; 如:new MyThread().satrt(); 区别二 设置线程名方式不同 实现Runnable接口可以在创建线程时T

qq_41664352的博客 7689

【Linux】一文带你了解C++中的多线程及其底层逻辑(thread、join、封装线程库、__thread让线程局部使用全局变量)

本章是线程的第三篇章,前两章带你了解了线程以及线程原生库中的操作,本章主要结合前两章的基础,学习入门c++中的线程函数,了解其底层是什么,并且自己封装一个线程库来使用并巩固。

溟洵的博客 2607

Java多线程-线程的创建(Thread类的基本使用)

介绍Java多线程的相关知识, Thread的创建, 常用方法的介绍和使用, 线程状态等.

trong_ 的烂笔头 2332

多线程——认识Thread类和创建线程

本文介绍:1.Java如何定义多线程。2.线程的创建。3.线程的构造方法。4.Thread的常见属性。并提出线程状态、中断等概念,为后续深入学习多线程编程打下基础。

2301_76937176的博客 1355
上一篇: 结构体struct 和 联合union 内存分配
下一篇: muduo源码分析(1):时间类
jacktangj
博客等级 码龄15年 7粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值