C++中类的成员函数作为 pthread_create的线程函数

C++类成员函数在多线程中的一些问题研究 之前只在C语言下,利用pthread搞过一些小demo玩。看实验室并行框架源码时发觉,全是C++风格的多线程,涉及到的pthread_create()为何不能以成员函数作为参数、锁成员变量、线程安全的类各种的问题,这些之前完全没有接触过。特此进行了两天的调研和思考,现在就简单整理一下这两天看过的资料。 由于就真的是光看没练,只是单纯翻了一堆大致原理,可能会有不少纰漏。阅读后觉得有不妥的地方,那很可能就真的是不妥的,笑。 1. C++类成员函数在内存中的摆法 之前转载了一篇文章,文中大致介绍C++类成员函数在 阅读详情

在C++的类中,普通成员函数作为pthread_create的线程函数就会出现参数问题,因为其不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static !
为什么呢?
当把线程函数封装在类中,this指针会作为默认的参数被传进函数中,从而和线程函数参数(void*)不能匹配,不能通过编译。
但是当我把类中的作为pthread_create的线程函数改为static之后,又遇到新的问题?即在该方法中访问其他非静态方法或者是变量时,没法访问,关于这个问题又怎么解决呢?
答案:将this指针作为参数传递即可。

struct PthreadParams{
     Tree* pThis;
     /*
     *其它相应的参数 省略
     **/
}
class Tree {
 public :
 void splitPthread(TreeNode<Sample>* node, const std::vector<Sample*>& data){
 /**
 相应程序业务处理 省略
 **/
pthread_t ThreadLeft,ThreadRgiht;  //定义线程
PthreadParams leftparams,rightparams;
//设置leftparams相应的参数 省略
pthread_create(&ThreadLeft,NULL,grow, (void*)leftparams);                   pthread_create(&ThreadRgiht,NULL,grow,(void*)rightparams);                  
pthread_join(ThreadLeft,NULL);
pthread_join(ThreadRgiht,NULL);
 }
static  void grow(void *p){
    PthreadParams *ptr = (PthreadParams*)p;
    //通过ptr->pThis;就可以访问类中非静态属性和方法 省略
}
}
在C++类中使用pthread实现多线程 现在pthread的api已经相当完善,使用其实现多线程难度不大,但是值得注意的一点是当想在类中使用pthread,调用pthread_create函数时,传入的运行函数,也就是下面这个原型的第三个参数void * ( * start_routine) (void *),如果是类的成员函数,必须是静态函数,否则将编译不通过,编译器会出一个这种错误。因为类的this指针在多线程下操作的问题,非静态的成 阅读详情

相关推荐

jmeter小白下载安装步骤

本文仅仅简单介绍了jmeter工具的下载安装,以及基础的操作步骤。

昔年@曦的博客 3494

关于C++类中成员函数传入pthread_create的问题以及相关函数参数的理解

pthread_create在C++中调用类内成员函数时需要注意 只能调用静态成员函数。

Heck_Jacke的博客 3036

Hi3516CV610开发板ISP调优实战——从在线调试到参数固化部署全流程

本文详细介绍了Hi3516CV610开发板ISP参数从在线调试到固化部署的全流程。针对调试参数重启丢失的痛点,重点解析了如何从PQTools安全导出参数、进行格式转换与适配,并通过烧录工具或系统更新两种路径将参数永久固化至Flash。最后提供了双重验证与常见问题排查方法,确保调优效果在产品中稳定生效。

weixin_29169505的博客 427

pthread_create函数详解(向线程函数传递参数)

一、pthread_create函数: 1、简介:pthread_create是UNIX环境创建线程的函数 2、头文件:#include &lt;pthread.h&gt; 3、函数声明: int pthread_create(pthread_t* restrict tidp,const pthread_attr_t* restrict_attr,void* (*start_rtn)(vo.........

mijichui2153的博客 16万+

HAMi 核心模块与架构设计

HAMi 的架构设计是围绕 Kubernetes 生态系统构建的,通过扩展 Kubernetes 的调度能力和设备管理能力,为用户提供了高效、灵活的异构设备虚拟化和管理解决方案。

北斗云的博客 2552

《备考系统架构设计师》 - 专栏介绍和目录

本专栏包括所有历年真题及详解、章节知识核心总结、精选高分论文、补充知识、专题总结等。欢迎订阅专栏。

数据知道的博客 4万+

多线程开发要点1:如何使用类的成员函数创建线程

如何使用类的成员函数创建线程(c++11 thread和pthread_create)?

每天进步一点点 1211

大数据NiFi(十一):NiFi入门案例一

注意:数据写出的目录可以不需要提前在对应节点上创建,默认是可以自动创建,可以通过“Create Missing Directories”属性配置。将输出文件的权限设置为此属性的值,格式必须是UNIX rwxrwxrwx,用-来代替被拒绝的权限(例如rw-r--r--)或八进制数字(例如644),可以使用表达式,例如${file.permissions}。这里需要使用到的处理器是“GetFile”和“PutFile”,完成以上需求对“GetFile”和“PutFile”相关属性进行配置。

Lansonli(蓝深李)的博客 1490

pthread_create()创建线程

pthread_create()创建一个线程

weixin_42106735的博客 434

数据挖掘实战-基于情感分析+网络语义分析对泾阳茯茶用户评论进行文本分析

本实验数据集来源于京东商城,使用Python爬虫获取泾阳茯茶商品的用户评论,共计3416条数据,字段有用户ID、用户昵称、IP属地、评论时间、评分、评论内容,共计6个字段信息。'''作者:艾派森csdn主页:https://blog.youkuaiyun.com/m0_64336780时间:2024/5/28'''# 导包import csv# 获取评论q=0.01',q=0.9,en;b_avif=1;b_dw=1412;b_dh=650;areaId=27;

m0_64336780的博客 1万+

GRSL 2026 即插即用 | Transformer篇 | DCSA:动态稀疏门控自注意力,兼顾长距离依赖与局部细节表达!

SDANet整体架构和模块Dynamic Channel Sparse Attention (DCSA):DCSA为Transformer块中的自注意力层。DCSA架构:样本级动态稀疏注意力:首次实现每个样本独立预测注意力稀疏度:通过轻量门控网络根据输入特征的复杂度自适应调整保留的通道数,简单样本使用更高稀疏度(如保留 20% 通道),复杂样本使用更低稀疏度(如保留 80% 通道),在保证精度的前提下平均计算量降低 50% 以上。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 110

Linux下多线程编程思考与学习----01(线程创建pthread_create函数详解)

pthread_create ()线程创建的使用与总结

HHzzy0123的博客 3225

ITKMontage---ITK自动拼接模块

本文分享ITK中Remote中的ITKMontage拼接模块,希望对各位小伙伴有所帮助!1. ITKMontage介绍在医疗图像处理过程中,图像拼接有很多用处,比如DR图像的拼接。ITKMontage可以快速稳定的处理数据量较大的拼接图像。强度不均匀性校正配准全局优化融合2. ITKMontage安装ITKMontageITKMontage可脱离ITK进行单独安装,也可在ITK安装时作为模块进行安装。单独安装ITK模块安装在ITK编译时,选择ITKMontage模块。

qq_40041064的博客 450

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static

在qt写一个聊天程序的时候使用pthread_create来群发消息时,一直报错,后来仔细学习了pthread_create发现普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static。 static void * send_msg(void * arg); static void * recv_msg(void * arg); pthread_create(&snd_thread, NULL, send_msg, (v

qq_41910353的博客 605

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static...

          在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static !         在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数。static定义的类的成员函数就是一个全局函数。   更多 参考  ht...

weixin_33720956的博客 362

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

linux中pthread_create实现类的成员函数做参数

linux中pthread_create实现类的成员函数做参数

henry_lihong的博客 597

c++里的 pthread_create 函数小结

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static !         在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数。static定义的类的成员函数就是一个全局函数。         例如:

快乐&&平凡 1万+

oc 协议 回调 静态成员_每日一问:c++类的成员函数,能作为线程的参数吗?

问:类的成员函数可以传入线程参数吗?回答:如果c语言的全局函数,可以。如果是类的静态成员函数,可以如果是类的普通成员函数,不可以为什么?《深入探索C++对象模型》中提到成员函数时,当成员函数不是静态的,虚函数,那么我们有以下结论:(1)&类名::函数名获取的是成员函数的实际地址;(2)对于函数x来讲obj.x()编译器转化后表现为x(&obj),&ob...

weixin_39614637的博客 101

为什么类的普通成员函数不能作为pthread_create的参数

为什么类的普通成员函数不能作为pthread_create的参数

qq_29621847的博客 293

C++ 在类里面使用多线程技术

有很多时候,我们希望可以在C++类里面对那些比较耗时的函数使用多线程技术,但是,C++类的成员函数的函数指针不能直接做为参数传到pthread_create,主要因为是C++成员函数指针带有类命名空间,同时成员函数末尾是会被C++编译器加上可以接收对象地址的this指针参数。因此需要将成员函数做一定的转化,将其转化为不被编译器加上this指针,而由我们自己来为该函数维护”this”指针即...

aiq8620的博客 345

类内使用 pthread_create 时,第三个参数为什么必须是静态函数

#include <pthread.h> int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void *(*start_routine)(void*), void *arg); 以上是 pthread_create() 的声明。 但是在学习《Linux高性能服务器编程》,实现线程池的时候,发现有这么一句话 类内使用 pthread_create 函数时,将函数的第 3 个参数指向一个静态函数(必须是静态

qq_39274501的博客 1671

类成员函数作为pthread_create函数参数

转自http://blog.youkuaiyun.com/luo6620378xu/article/details/8521940 近日需要将线程池封装成C++类,类名为Threadpool。在类的成员函数exec_task中调用pthread_create去启动线程执行例程thread_rounter。编译之后报错如下: spfs_threadpool.cpp: In member functi

enockipp的小'码'头 2501

c++线程类 linux,Linux下使用C++创建线程

Linux下使用C++创建线程,求助本帖最后由 hello_world_2012 于 2012-08-04 20:57:34 编辑请高手指点下:代码如下:#include#include#includeusingnamespacestd;/*新创建1个线程要执行的操作测试函数*/voidf1(void*)//{inti;for(i=0;i<6;++i){sleep(2);//u...

weixin_32428571的博客 843

线程池相关问题

在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数。在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static!void*Threadstart_thread(void*arg)//静态成员函数只能访问静态变量或静态函数,通过传递this指针进行调用。函数原型中的第三个参数,为函数指针,指向处理线程函数的地址。...

weixin_56216557的博客 103

类成员函数作线程的启动函数参数

class A {         void run()         {                 pthread_create(&threadId, NULL, run_func, NULL);         }         void* run_func(void*)         {                 // .....         }

simon的天空 1577
上一篇: MySQL中权限管理
下一篇: c++多线程操作全局变量的锁的问题
我爱默小兜
博客等级 码龄14年 387粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值