文档章节

类成员函数作为线程函数

zhangyujsj
 zhangyujsj
发布于 2015/01/13 09:12
字数 496
阅读 23
收藏 0

-------------------类成员函数不能作为线程函数---------------------------
    一般来说,C++的类成员函数不能作为线程函数。这是因为在类中定义的成员函数,编译器会给其加
上this指针。请看下列程序:

#include "windows.h" 
#include <process.h>

class ExampleTask   
 
  public:  
   void taskmain(LPVOID param);
   void StartTask();   
};  
void ExampleTask::taskmain(LPVOID param)
{}  
 
void ExampleTask::StartTask()   
 
  _beginthread(taskmain,0,NULL);
 
 
int main(int argc, char* argv[]) 
{ 
  ExampleTask realTimeTask; 
  realTimeTask.StartTask(); 
  return 0; 
}

出现编译错误:
error C3867: 'ExampleTask::taskmain': function call missing argument list; use '&ExampleTask::taskmain' to create a pointer to membe
下面Code会出现与此同样的编译错误。
#include "windows.h" 
#include <process.h> 
class ExampleTask   
{   
public:  
   void taskmain(LPVOID param);   
};  
 
void ExampleTask::taskmain(LPVOID param)   
{}  
 
int main(int argc, char* argv[]) 
{ 
  ExampleTask realTimeTask; 
  _beginthread(ExampleTask::taskmain,0,NULL); 
  return 0; 
}

如果一定要以类成员函数作为线程函数,通常有如下解决方案:

(1)将该成员函数声明为static类型,去掉this指针;
    即将类定义改为:
#include "windows.h" 
#include <process.h> 
class ExampleTask   
 
  public:  
   void static taskmain(LPVOID param);   
   void StartTask();   
};

但是将成员函数声明为静态虽然可以解决作为线程函数的问题,但是它带来了新的问题,那就是static成
员函数只能访问static成员。解决此问题的一种途径是可以在调用类静态成员函数(线程函数)时将this
指针作为参数传入,并在改线程函数中用强制类型转换将this转换成指向该类的指针,通过该指针访问非
静态成员。
 
(2)不定义类成员函数为线程函数,而将线程函数定义为类的友元函数。这样,线程函数也可以有类
成员函数同等的权限;  
我们将程序修改为:
#include "windows.h" 
#include <process.h>

class ExampleTask   
 
  public:  
   friend void taskmain(LPVOID param);   
   void StartTask(); 
   int value;
};

void taskmain(LPVOID param)   
 
  ExampleTask * pTaskMain = (ExampleTask *) param;   
  //通过pTaskMain指针引用 
 
 
void ExampleTask::StartTask()   
 
  _beginthread(taskmain,0,this); 
} 
int main(int argc, char* argv[]) 
{ 
  ExampleTask realTimeTask; 
  realTimeTask.StartTask();

  return 0; 
}

本文转载自:http://blog.163.com/lyz_sea/blog/static/115586707201101025443711/

共有 人打赏支持
zhangyujsj
粉丝 24
博文 358
码字总数 224241
作品 0
广州
私信 提问
Dalvik虚拟机进程和线程的创建过程分析

我们知道,在Android系统中,Dalvik虚拟机是运行Linux内核之上的。如果我们把Dalvik虚拟机看作是一台机器,那么它也有进程和线程的概念。事实上,我们的确是可以在Java代码中创建进程和线程,...

Luoshengyang
2018/06/26
0
0
线程局部存储空间 pthread_key_t、__thread 即 ThreadLocal

线程局部存储空间 pthreadkeyt、_thread 即 ThreadLocal thread 参考: 线程局部变量 _thread 关键字 thread是GCC内置的线程局部存储设施,thread变量每一个线程有一份独立实体,各个线程的值...

呆呆的张先生
2018/08/30
0
0
java的线程同步机制synchronized关键字的理解

线程同步: 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同...

亚特兰缇斯
2015/03/04
0
0
对Pthread线程进行简单的类封装

1.封装遇到的问题 将Pthreads线程封装为抽象类,这样用户在使用线程时,只需要继承一下这个抽象类,并实现相应的接口就可以了。这样做的好处是用户可以将注意力集中在线程所要执行的逻辑上,...

wbf961127
2017/11/13
0
0
this指针用法

this指针只能在一个类的成员函数中调用,它表示当前对象的地址。下面是一个例子: void Date::setMonth( int mn ) { month = mn; // 这三句是等价的 this->month = mn; (*this).month = mn; ...

晨曦之光
2012/04/13
320
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue.js开发环境搭建说明(mac)

vue开发环境搭建(mac) 投影放大:cmd + + 安装Node 下载Node 官网下载 https://nodejs.org/en/download/ 安装Node 双击安装包,选择安装目录,比如: /usr/local/bin 安装成功后最好记录一...

Danni3
21分钟前
2
0
Qt编写自定义控件3-速度仪表盘

前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业...

飞扬青云
26分钟前
1
0
【论文阅读】Image Super-Resolution via Deep Recursive Residual Network

题目:通过深度递归残差网络实现图像的超分辨率 摘要: 近年来,基于卷积神经网络的模型在单张图像的超分辨率上已经取得了巨大的成功。由于深度网络的强大,这些CNN模型学习了从低分辨率输入...

云烟成雨forever
28分钟前
2
0
为什么强烈建议大家使用枚举来实现单例

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

群星纪元
47分钟前
11
0
Confluence 6 超过当前许可证期限进行升级

这个页面将会对你在进行 Confluence 升级的时候超过了当前许可证的期限进行升级的情况。 许可证警告 在升级的过程中,你将会在 Confluence 的应用程序日志(log file)中看到类似下面的错误提...

honeymoose
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部