**C++ 用类封装 pthread

Linux·C/C++终止线程的方法 四种终止线程的方法 阅读详情

C++ 用类封装 pthread
转载https://blog.youkuaiyun.com/wangzhiyu1980/article/details/43984465
一个项目中需要用到pthread,发现把它封装到类中使用起来更加的方便。

这里保存了实例代码,以备以后使用。

头文件中定义了ThreadBase类,它包含了线程基本的一些接口,start() join() 和quit()

run()为接口函数,使派生类可以实现自己的工作函数。

thread_base.h

#ifndef THREAD_BASE_H
#define THREAD_BASE_H

#include <pthread.h>
#include
#include <signal.h>

using namespace std;

class ThreadBase
{
private:
pthread_t m_tid;
bool m_isAlive;

private:
static void* start_func(void* arg);

public:
int start();
int join();
int quit();

pthread_t getTid();
bool isAlive();

virtual void run() = 0;
virtual ~ThreadBase();

};

#endif

thread_base.cpp, 在析构函数中会通过thread_kill向线程发送信号,终止正在运行的线程。

这里并没有采用pthread_cancle的方式。

#include “thread_base.h”

void* ThreadBase::start_func(void* arg)
{
ThreadBase ptr = (ThreadBase) arg;
ptr->run();

return NULL;

}

int ThreadBase::start()
{
cout << “Start a new thread” << endl;
if (pthread_create(&m_tid, NULL, start_func, (void*)this) != 0)
{
cout << “Start a new thread failed!” << endl;
return -1;
}

cout << "Start a new thread success! tid="<< m_tid << endl;
m_isAlive = true;
return 0;

}

int ThreadBase::join()
{
int ret = -1;
cout << “Join the thread tid=” << m_tid <<endl;
ret = pthread_join(m_tid, NULL);

if (ret != 0)
    cout << "Join the thread fail tid=" << m_tid <<endl;
else
    cout << "Join the thread success tid=" << m_tid <<endl;

return ret;

}

int ThreadBase::quit()
{
cout << “Quit the thread tid=” << m_tid <<endl;
m_isAlive = false;
return 0;
}

pthread_t ThreadBase::getTid()
{
return m_tid;
}

bool ThreadBase::isAlive()
{
return m_isAlive;
}

ThreadBase::~ThreadBase()
{
cout << “~ThreadBase tid=”<< m_tid << endl;
if (m_isAlive)
{
cout << "Kill the thread tid= "<< m_tid << endl;
pthread_kill(m_tid, 0);
}
}

test.cpp是一个测试文件,它会创建3个线程,前两个以正常方式结束,第3个会在析构函数中结束线程。

#include “thread_base.h”
#include “unistd.h”

class ThreadTest1 : public ThreadBase
{
public:
void run();
};

void ThreadTest1::run()
{
while (isAlive() == true)
{
cout << “Thread test 1 tid=”<< getTid() << endl;
sleep(1);
}
}

class ThreadTest2 : public ThreadBase
{
public:
void run();
};

void ThreadTest2::run()
{
while (isAlive() == true)
{
cout << “Thread test 2 tid=”<< getTid() << endl;
sleep(1);
}
}

class ThreadTest3 : public ThreadBase
{
public:
void run();
};

void ThreadTest3::run()
{
while (isAlive() == true)
{
cout << “Thread test 3 tid=”<< getTid() << endl;
sleep(1);
}
}

int main()
{
ThreadBase *test1 = new ThreadTest1();
ThreadBase *test2 = new ThreadTest2();
ThreadBase *test3 = new ThreadTest3();

test1->start();
test2->start();
test3->start();

sleep(10);

test1->quit();
test2->quit();

test1->join();
test2->join();

delete test1;
delete test2;
delete test3;

return 0;

}

make file

CC = g++
RM = rm
CFLAGS = -O2 -lpthread
OBJSDIR = .objs
#VPATH = .
OBJS = thread_base.o test.o
TARGET = test

(OBJSDIR):mkdir−p./(OBJSDIR): mkdir -p ./(OBJSDIR):mkdir−p./@
(TARGET):(TARGET):(TARGET):(OBJSDIR) $(OBJS)
$(CC) -o $(TARGET) $(OBJSDIR)/*.o $(CFLAGS)

$(OBJS): %.o:%.cpp
$(CC) -c $(CFLAGS) $< -o (OBJSDIR)/(OBJSDIR)/(OBJSDIR)/@

clean:
-$(RM) (TARGET)−(TARGET) -(TARGET)−(RM) $(OBJSDIR)/*.o

当然如果需要还可以在基类中添加更多的功能,比如给线程设置一个逻辑的名字,添加线程对应的队列(类似 TLS)等方式。
————————————————
版权声明:本文为优快云博主「zy__」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/wangzhiyu1980/article/details/43984465

Linux:C++ 封装pthread Linux:C++ 封装pthread 项目要用到多线程,主要包括: 通信一个线程,媒体处理一个线程,还有个主线程 主要使用方法是通信线程能够打开或者停止媒体处理线程,同时要保证资源释放的安全 由于平台是Linux,打算使用pthread,顺道学习一哈 目标 将pthread封装进类中;方便的线程停止;停止线程时的资源释放 背景知识 pthread中文教程:https://... 阅读详情

相关推荐

C++ 多线程开发——基于pthread封装的调度队列和Promise工具

说明 多线程开发中, 经常会用到一些异步调用系统,在传统C++领域, 也只有在C++11之后才有了一些异步友好型接口可以使用, 但C++11提供的仅有的几个异步工具适用面并不广, 在真正用在工程中的时候也会进行二次甚至多次封装,相比之下, iOS开发中的gcd是一个很不错的调度工具,ES6中的Promise工具也是一个很不错的工具。于是突发奇想,作为一个把C++当做最爱编程语言的我, 是不是可以...

逗神大人的博客 905

[C++11 std::thread] 使用C++11 编写 Linux 多线程程序

From: http://www.ibm.com/developerworks/cn/linux/1412_zhupx_thread/index.html   本文讲述了如何使用 C++11 编写 Linux 下的多线程程序,如何使用锁,以及相关的注意事项,还简述了 C++11 引入的一些高级概念如 promise/future 等。 0 评论: 朱

JoeBlackZQQ的专栏 1万+

Linux多线程编程与Pthread同步机制详解

多线程是现代操作系统实现并发编程的核心技术,通过共享地址空间的轻量级执行单元显著提升程序性能。POSIX线程(Pthread)作为Linux系统标准线程API,提供线程创建、同步原语等60余个函数接口,其核心原理基于内核级轻量级进程(LWP)实现。在并发编程中,互斥锁(Mutex)和条件变量(Condition Variable)是解决资源竞争的关键同步机制,配合读写锁(rwlock)可优化读多写少场景。通过线程特定数据(TSD)和线程池模式,开发者能构建高性能服务器等实时系统。掌握Pthread的线程生命

weixin_30628801的博客 472

java线程是否活着_如何查看一个进程中的某个线程是否存活?

pthread_kill:别被名字吓到,pthread_kill可不是kill,而是向线程发送signal。还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数。int pthread_kill(pthread_t thread, int sig);向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响...

weixin_34245159的博客 1434

IAR9.X半主模式异常解析:为何硬件复位后仍陷调试状态?

本文深入解析了IAR 9.X半主模式异常问题,探讨了硬件复位后MCU仍陷调试状态的原因及解决方案。通过分析半主模式工作机制,提供了禁用半主功能、重写低级IO函数等具体方法,并给出了版本兼容性处理和调试与量产配置分离的优化建议,帮助开发者有效解决复位异常问题。

oo7890的博客 605

SNN系列|编码篇(2)时序编码

Tempotral Coding 选择编码方法是要根据编码对象以及模型如何处理编码信息进行选择,如下是一种时序信息的编码对比: Threshold-based encoding 又称为tempotral contrast,该方法可以用于编解码一段序列,当差值超过阈值时发放脉冲,阈值是根据编码的序列自适应变化的。 使用该编码方法时,实值序列最好是沿时间变化的,因为在根据差分决定是否发放脉冲后,脉冲的顺序与差分顺序有关。 Time-to-first spike coding 该编码方法将信息用神经元首次

Tianlong Lee的博客 1万+

C++11 终止一个thread对象表示的线程

“terminate 1 thread + forcefully (target thread doesn’t cooperate) + pure C++11 = No way”. 233333 可以用pthread.h里的pthread_cancel来解决。 code: #inclu...

已迁移至 https://seekstar.github.io/ 1万+

一文了解向量数据库在RAG中扮演的角色

向量数据库:AI新纪元的基石。探索如何通过这一创新技术优化RAG,提高语言模型的信息处理能力

2401_82452722的博客 2452

在Linux中使用线程

我并不假定你会使用Linux的线程,所以在这里就简单的介绍一下。如果你之前有过多线程方面的编程经验,完全可以忽略本文的内容,因为它非常的初级。首先说明一下,在Linux编写多线程程序需要包含头文件pthread.h。也就是说你在任何采用多线程设计的程序中都会看到类似这样的代码:#include <pthread.h>当然,进包含一个头文件是不能搞定线程的,还需要连...

weixin_34289744的博客 2577

波动性GARCH模型与波动率预测(代码+结果分析)

本文介绍的ARCH、GARCH模型可以刻画出随时间变化的条件异方差。

celiaweiwei的博客 2万+

naca翼型_STARCCM+计算二维翼型气动性能

STAR-CCM+计算二维翼型气动性能一算例背景机翼理论主要研究翼型在流体中运动时的力学特性。在工程领域中,机翼以升力面、控制面、叶片或桨叶等形式出现。舰船上的舵、水翼、减摇鳍等都是机翼,螺旋桨、汽轮机叶片和压缩机叶片也都是利用机翼原理工作的,而在研究船舶操纵性时,甚至还可把船体的水下部分看作一个巨大的机翼。随着航空科学的发展,世界各主要航空发达的国家建立了各种翼型系列。美国有NACA系...

weixin_39863741的博客 1万+

linux多线程封装,Linux pthread封装

概 述C++11提供了std::thread类来实现多线程,但是对于Linux上的服务器编程,C++11的std::thread使用不便且没有附加值(参考知乎 陈硕 徐辰的回答)。本文介绍对pthread的简单封装。函数接口下面介绍线程相关的常用API,头文件pthread.h1. pthread_createpthread_create()用于创建一个线程,成功返回0,失败返回错误码。函数原型:...

weixin_42365234的博客 447

微信小程序|基于小程序+云开发制作一个租房小程序

经济发展的同时伴随着大批人群的流动,租房需求一直是持久不衰的话题,如何租好房,好租房,跟随此文一起制作一个租房小程序,让租房不再困难。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 4928

Qt系列文章034-从pthread 到QThread

1 前言   今天想记录一下 Linux上的线程开发以及Qt对线程的封装(Linux平台部分)。 所以内容会偏向理论部分,而今天要记录的这篇文章,也是我从网上看了以后,觉得很有必要记录一番,非常的有理论意义和深入线程的探索挖掘!好了,直接进入枯燥的理论主题吧! 2 正文   首先Linux上的线程API使用的是pthread库,所有我们来粗略认识下 pthread。   要在程序中使用pthread线程,究竟会用到哪几部分的功能呢? 创建线程是必须的吧,pthread_create(); 设置线程的属性也

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 2394

飞牛fnNAS搭建个人小账本

本文介绍了如何在飞牛NAS上部署ezBookkeeping个人记账应用。该开源工具支持多平台使用,具备双因素认证、多级分类等功能。文章详细讲解了Docker激活、镜像下载、容器部署等步骤,并展示了账户管理、交易记录等基础操作。同时指导用户通过ZeroTier实现远程访问,方便随时随地使用个人记账系统。该方案既保障了数据隐私,又提供了专业记账功能,适合对财务隐私敏感的用户。

dgnankai的专栏 782

SAP 系统里生成 PDF 的几条主干路径:从 Spool 转换到 Adobe 原生渲染,再到 BTP 云服务

本文系统梳理了SAP生态中PDF生成的多种技术方案,包括Spool转换、OTF转换、Smart Forms/Adobe Forms原生生成以及云端服务等不同路径。文章通过实际案例和代码示例,详细分析了各方案的适用场景、技术要点和工程实践建议,特别强调了多语言支持、字体处理、性能优化等关键因素。针对不同业务需求,提供了从简单导出到复杂交互式PDF的完整解决方案框架,为SAP环境下的PDF处理提供了实用指南。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 285

深入浅出 Linux 线程控制:从原生 API 剖析到 C++ 面向对象优雅封装

本文系统性地讲解了 Linux 下的线程控制机制。从轻量级进程(LWP)的核心概念入手,详细剖析了 POSIX 线程库的创建、终止、等待与分离等 API。结合虚拟地址空间布局,揭示了线程 ID 的本质与内存管理逻辑。为了契合现代工程实践,文章通过“静态成员函数+指针强转”巧妙解决了函数签名冲突,手把手实现了一个优雅的 C++ 面向对象线程类。最后,深入探究了 TCB 结构与内核底层的 clone 系统调用,帮助读者完成从应用层 API 到内核原理的全面进阶。

kumaxi的博客 510

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【C++学习(21)】基于 C++ STL 和 pthread 实现一个多线程并发访问的队列

pthread_create 创建线程:https://www.runoob.com/cplusplus/cpp-multithreading.htmlpthread_exit 终止线程:https://www.runoob.com/cplusplus/cpp-multithreading.html连接和分离线程当创建一个线程时,它的某个属性会定义它是否是可连接的(joinable)或可分离的(detached)。只有创建时定义为可连接的线程才可以被连接。

AbiUni(YY熊) 725

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

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

[Linux]多线程(二)原生线程库---pthread库的使用

本文详细介绍了Linux下pthread库的使用,涵盖了多线程编程的核心函数和概念。主要内容包括: 线程创建:通过pthread_create创建线程,需注意参数传递和资源管理。 线程回收:使用pthread_join等待线程结束并回收资源,避免资源泄漏。 线程退出:通过pthread_exit或return终止线程,区分主线程与子线程的退出行为。 线程分离:使用pthread_detach将线程标记为分离状态,线程结束后自动释放资源。 互斥锁与条件变量:通过pthread_mutex和pthread_c

石墨博客 1569

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

pthread多线程: 创建最简单的线程

学习使用Pthread的原因分析,以及使用Pthread创建最简单的线程。

baiyu33的博客 1194

两种 C++ 多线程编程方式,看完不懂打我...

多线程在实际编程中的重要性不言而喻,对 C++ 而言,当我们需要使用多线程时,有多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C++11 开始支持的 std::thread 库,以及其他一些第三方库 libdispatch(GCD)和 OpenMP 等等。 至于选择哪种多线程编程方案,需要根据你的实际项目、运行平台、团队协作等因素来考虑。一般而言,如果使用的是 Linux 操作系统,那么可以直接使用系统提供的 pthread 库编写多线程 C++ 程序;如果需要跨

程序员「阿基米东」的编程之旅 2万+

pthread_create如何传递多个参数

http://zhidao.baidu.com/question/315398992.html 涉及多参数传递给线程的,都需要使用结构体将参数封装后,将结构体指针传给线程 定义一个结构体 struct mypara {        var para1;//参数1        var para2;//参数2 } 将这个结构体指针,作为void *形参的实际参数传递 stru

海上雨 3055

从 pthread 到 std::thread:一文吃透 Linux 线程底层模型与跨平台封装本质

本文深入剖析了Linux线程的实现机制与设计原理。首先揭示了Linux线程的1:1轻量级进程模型本质,解释pthread_t实为线程控制块地址而非内核ID,并详细分析了线程资源在虚拟地址空间的分布。文章重点解析了pthread_join使用二级指针的原因及线程退出的资源回收机制,进而探讨C++ std::thread对pthread的跨平台封装本质,比较了两者的核心差异。最后通过从std::thread创建到内核调度的完整流程,展现了从API到底层的知识闭环,强调理解底层原理对解决实际问题的重要性。全文系统

2402_89711598的博客 373

[c++] c语言并发编程——POSIX

先来看以下关于c语言的几个问题 2.1 void* C语言中void * 为 “不确定类型指针”,void *可以用来声明指针。如:void * a; (1)void *可以接受任何类型的赋值:     void *a = NULL;     int * b = NULL;     a = b;//a是void * 型指针,任何类型的指针都可以直接赋值给它,无需进行强制类型转换 (2)vo...

LumenWang 2306

muduo网络库学习之Exception类、Thread 类封装中的知识点(重点讲pthread_atfork())

一、Exception类封装 class Exception : public std::exception  #include  int backtrace(void **buffer, int size); // backtrace 栈回溯,保存各个栈帧的地址  char **backtrace_symbols(void *const *buffe

Meditation 3519

Linux 多线程(四)线程等待,线程分离,线程管理,C++多线程,pthread库

本文深入讲解了Linux线程管理的核心内容,包括线程等待、分离、ID管理及线程局部存储等关键机制。重点分析了pthread_join的线程资源回收原理,解释了分离线程(detached)的自动释放特性。详细阐述了用户态线程控制块(TCB)与内核轻量级进程(LWP)的1:1对应关系,揭示了Linux线程模型的本质。同时介绍了__thread关键字实现的线程局部存储(TLS)机制,以及C++标准线程库对pthread的跨平台封装。通过底层原理分析与代码示例,全面展示了Linux线程从创建到回收的完整生命周期管理

2401_88465894的博客 751
上一篇: Ubuntu提示boot空间不足的解决方法
下一篇: leetcode刷题--简单题1比特与2比特字符
cloudless_sky
博客等级 码龄8年 106粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值