C++线程类封装实例

最简单的C++ 线程封装 实现了各个平台下的线程封装,只需要继承这个基类,实现一个Run方法,就可以实现对象化的线程类,支持Windows Linux MAC 立即下载

先上代码:

class Thread : NoCopy{
    Thread():_quit(false), _isRunning(false){}
    vartual ~Thread(){}

    int start(bool isJoin = false){    //默认是detach模式
        if(_isRunning){
            return -1;        
        }
        
                _quit = false;
#ifdef SUPPORT_CPLUSPLUS11
        std::thread thd(&Thread::work_thread, this);

        if (isJoin) {
            thd.join();
        } else {
            thd.detach();
        }

#else
        int ret = pthread_create(&_thread_t, NULL, work_thread, (void*)this);

        if (ret != 0) {
            return -2;
        }

        if (isJoin) {
            void* threadResult = 0;
            ret = pthread_join(_thread_t, &threadResult);

            if (ret != 0) {
                return -3;
            }
        } else {
            ret = pthread_detach(_thread_t);

            if (ret != 0) {
                return -4;
            }
        }

#endif
        return 0;
    }

    bool isQuit() const{
        _qiut = true;

        if(isWaiting){
            while(_isRunning){
                msleep(10);
            }        
        }
    }

    bool isRunning() const {
        return _isRunning;
    }

    static void msleep(int ms) {
#ifdef SUPPORT_CPLUSPLUS11
        std::this_thread::sleep_for(std::chrono::milliseconds(ms));
#else
        usleep(ms * 1000);
#endif
    }

protected:
    //必须被子类实现
    virtual void run() = 0;

private:
#ifdef SUPPORT_CPLUSPLUS11
    void work_thread() {
        _isRunning = true;
        run();
        _isRunning = false;
    }
#else
    static void* work_thread(void* param) {
        Thread* pThis = (Thread*)param;
        pThis->_isRunning = true;
        pThis->run();
        pThis->_isRunning = false;
    }
#endif

private:
#ifdef SUPPORT_CPLUSPLUS11
    std::atomic<bool> _quit;

    std::atomic<bool> _isRunning;
#else
    volatile bool _quit;

    volatile bool _isRunning;

    pthread_t _thread_t;
#endif
};

用法示例:

class myThread:public Thread{
public:
    myThread(){}
    ~myThread(){}

protected:
    void run(){
        while(!isQuit()){
            //do something
        }
    }

};


int main(){
    myThread thread;
    thread.start();

    thread.quit(true);//可以选择是否等待线程结束,默认是等待     

}

 

YOLOv8改进 | Conv篇 | DWRSeg扩张式残差助力小目标检测 (附修改后的C2f+Bottleneck) 本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv8中的C2f和Bottleneck模块,主要针对的是小目标检测,主要创新点可以总结如下:多尺度特征提取机制的深入研究和创新的DWR模块和SIR模块的提出这种方法使得网络能够更灵活地适应不同尺度的特征,从而更准确地识别和分割图像中的物体。通过本文你能够了解到DWRSeg的基本原理和框架,并且能够在你自己的网络结构中进行添加(DWRSeg需要增加一定的计算量一个DWR模块大概增加0.4GFLOPs)。 阅读详情

相关推荐

挑战第七天:Llamaindex RAG 实践

安装python 依赖包,并安装 Llamaindex和相关包以及Sentence Transformer 模型。进入开发机后,创建新的conda环境,命名为。镜像,然后在资源配置中,使用。的选项,然后立即创建开发机器。后,点击 选择镜像 使用。然后安装相关基础依赖。

weixin_53579823的博客 728

c++11 std::thread多线程简单模型

c++11 std::thread的使用介绍(带简单模型的代码参考)

Vis_Stu的专栏 961

基于ESP32的气象雷达站设计与实现

物联网技术通过嵌入式设备实现环境数据的实时采集与可视化,其中ESP32凭借其双核处理器和WiFi/蓝牙功能成为热门选择。本项目利用ESP32结合LVGL图形库,构建了一个低成本气象监测系统,通过OpenWeatherMap API获取全球气象数据并在7英寸触摸屏上动态展示。系统采用三级优化策略处理高分辨率雷达图,包括服务端预处理、硬件加速解码和显示增强,有效解决了内存占用和帧率问题。在物联网设备开发中,类似方案可应用于智能家居、农业监测等场景,特别是需要实时数据可视化的领域。通过SPIFFS存储和zlib压

weixin_42524864的博客 423

C/C++开发,无可避免的多线程(篇五).实现自己的线程封装类

C/C++开发,无可避免的多线程(篇四).实现自己的线程封装类,如何基于c++98的pthread_t封装线程类,如何基于c++11标准库的std::thread封装线程类,并与c++98的版本保持一致,最后将两个版本的线程类合成一个线程版本mythread,给出实现过程、演示结果及源代码。

技术需要分享 1939

DLMS-Blue-Book蓝皮书—曲线类

attribute_index 1 指的是第 1 个属性(即 logical_name),attribute_index 2 指的是第 2 个属性,等等;如果其他“曲线通用类”对象捕获了这个缓冲区,它们的缓冲区也将被清空,以保证它们的缓冲区条目是同质的。如果捕获对象是曲线通用类的缓冲区,则 data_index 标识缓冲区(即列)中的捕获对象(即内部曲线通用类中的列);如果曲线通用类已排序,则调用捕获方法将把新条目存储在缓冲区中的适当位置,移动所有后续条目,并可能丢失最不相关的条目。

一个bug是bug,多个bug能work 1454

STM32F103+LAN9252实战:从站代码迁移中的5个硬件坑与解决方案

本文分享了将EtherCAT从站代码从STM32F767迁移至STM32F103平台时,搭配LAN9252遇到的五个典型硬件问题及解决方案。核心挑战包括时钟源不匹配、FSMC时序配置、中断映射错误、片选资源不足以及Flash烧录异常。文章通过实战经验,强调了硬件差异对代码迁移的关键影响,并提供了具体的调试思路与配置方法。

p5l2m9n4o6q的博客 698

C++线程的封装

线程封装

qq_31231915的博客 985

STM32--LoRa通信模块

模块根据MD0的配置与AUX引脚的状态会进入不同的功能其中在通信功能下,包含4种工作模式。

qq_47258284的博客 1万+

封装一个C++的线程类

封装一个C++的线程类

weixin_44797811的博客 1169

【主题建模】一种基于深度学习的主题建模方法:BERTopic(理论篇)

在我的博客中已经写了很多关于主题建模的内容,当你准备了解 BERTopic 时,默认你已经知道了 LSA、pLSA、NFM、LDA 等传统的主题建模方法。关于主题建模的前置知识我在这里不做赘述,感兴趣的同学可以看看我前几篇博客。学习 BERTopic 需要一定的机器学习基础,让我们一起开始吧!

Data · Model · Agent · Repeat 9895

高通IPA硬件加速介绍

‌ 高通IPA (Internet Protocol Accelerator)模块是一种硬件加速模块,由高通公司(Qualcomm)提供,主要用于优化移动设备上的网络数据传输,特别是通过 LTE 、 5G 等移动网络的数据传输‌‌。IPA模块通过硬件加速,显著提高了数据传输的速度和效率,同时降低了设备的功耗,并提供了更稳定的网络连接,减少了数据传输中的丢包和延迟‌。

四儿家的小祖宗的博客 1624

一个封装好的线程类

一个封装好的线程类 一.创建线程函数 常用的创建线程的函数是CreateThread,还有MFC中的AfxBeginThread方法.另一种函数是_beginthreadex, 其实它在内部调用了CreateThread,在调用之前_beginthreadex做了很多的工作,从而使得它比CreateThread更 安全.所以一般使用_beginthreadex来创建线程.于是以下使用_beginthreadex函数来创建线程类. 二.线程类示例 1.Thread.h文件如下: #ifndef _THREAD

weixin_43587848的博客 244

Mastercam软件二次开发:使用C#进行Mastercam二次开发

C#(发音为“C Sharp”)是一种现代、面向对象的编程语言,由微软开发,首次发布于2000年。它结合了C和C++的强大功能,同时引入了Java的垃圾回收机制,使得C#在开发效率和运行性能之间找到了一个良好的平衡点。C#的设计目标是提高开发者的生产力,它支持多种编程范式,包括面向对象、泛型、委托和事件等,这使得它成为开发Windows应用程序、Web应用程序、游戏(尤其是使用Unity引擎)和企业级应用的理想选择。

kkchenjj的博客 2216

c++ 线程类 linux,C++封装线程类的实现方法

本文实例讲述了C++封装线程类的实现方法。分享给大家供大家参考。具体方法如下:// 给主窗口的通知消息#define WM_CUTTERSTART WM_USER + 100 // wParam == xxx lParam==xxxx/*外面调用这个类时,只需要IsRunning() Startxxx(xxx) Suspendxxx() Resumexxx() Stopxxx()*//...

weixin_33836754的博客 303

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++ - 简化线程调用的好方法 - 传递类普通成员函数指针给线程作为参数

以前启动线程, 每个启动线程的地方都要写好多句话. 唯一不同的地方是要执行的类静态成员函数不同.明显有很多的多余代码实现, 感觉很不好.正好昨天, 做了sqlite3回调函数的改进(sqlite - sqlite3_exec - c++回调函数的处理).里面用到了给回调函数传递类普通成员函数的指针, 和如何用在类回调函数中使用参数中传入的类实例指针调用函数参数传进来的类普通成员函数指针.今天想对启动线程的代码, 也做类似的处理.弄了2个小时, 搞定了.

博客标题不能为空 1359

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用C++11的function/bind组件封装Thread以及回调函数的使用

之前在http://www.cnblogs.com/inevermore/p/4008572.html中采用面向对象的方式,封装了Posix的线程,那里采用的是虚函数+继承的方式,用户通过重写Thread基类的run方法,传入自己的用户逻辑。 现在我们采用C++11的function,将函数作为Thread类的成员,用户只需要将function对象传入线程即可,所以Thread的声明中,应...

weixin_34307464的博客 241

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++多线程编程

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

weixin_34095889的博客 80

Windows API一日一练(43)WaitForSingleObject函数

上面已经介绍怎么样创建一个简单的线程,在那里就需要使用函数WaitForSingleObject,它是用来做什么的呢?其实它是用来实现等待线程结束的,它的机理是这样的,通知Windows操作系统,现在我进入睡眼状态,当我关注的对象条件是否满足,如果满足了就吵醒我。在那里关注的对象是线程是否退出,这是一个条件测试。如果不等待线程关闭,就去删除线程的资源,就会出错的。使用前面的线程是简单一些,但它不合

裸奔的蜗牛的专栏 561

2022-07-27 C++并发编程(二)

线程归属权转移,在C++中,线程只可移动不可拷贝,有明确归属权。线程只支持移动,不支持拷贝,这是很容易理解的,也就是所谓的所有权转移,读者可简单练习体会。

老林的博客 300

08面向对象编程风格

1.Thread类图 2.代码 Thread.h #ifndef _THREAD_H_ #define _THREAD_H_ #include class Thread { public: Thread(); virtual ~Thread(); void Start(); void Join(); void SetAutoDelete(bool autoDelete)

INGNIGHT的专栏 357

基于对象风格的线程类封装

基于对象风格的编程思想和面向对象的编程思想不同。面向对象使用纯虚函数为派生类提抽象接口,是一种抽象类(实现回调);而基于对象使用具体类,在类里面通过注册函数实现回调;若是C风格的编程思想,则是定义全局的注册函数指针。 基于对象风格的线程类封装代码如下: 类头文件://start from the very beginning,and to create greatness //@author:

缱绻的西格玛 721

4.自定义线程

1 #include <iostream> 2 #include <thread> 3 #include <cstdlib> 4 #include <iostream> 5 using namespace std; 6 7 class mythread :public thread 8 { 9 public: ...

weixin_30838921的博客 110

C++线程类的封装

操作系统:ubuntu20.04LTS使用头文件:pthread.h在之前的文章中已经实现了C++不可复制基类和线程同步类的封装,本文章内容实现对线程的封装。

pan_1214_的博客 1098

c++ 线程类

可以看到在 createThread() 成员函数里调用了 pthread_create() 进行线程的创建,而且线程函数是此类的一个 static 函数 startThread(void* arg),为什么是 static 类型函数呢?现在C++11及之后版本已经提供了线程类来使用线程,但我们在编译的时候还是需要添加 -lpthread 链接(也许其线程类实现还是得依赖 pthread 库吧,没看过源码还不清楚),那如果不使用c++提供的线程类,我们在实际项目中是如何封装的线程类呢?

tianyexing2008的博客 1686

C++线程类

C++多线程,C++线程类

AllKillMan的专栏 1610
上一篇: 简述C++中static的几种用法
下一篇: js给input赋值无效的问题
胡撸娃哈哈
博客等级 码龄12年 2粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值