CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

怎样把pthread_create的线程函数当作类的成员函数编译通过?

楼主libad()2003-11-04 17:58:36 在 C/C++ / C++ 语言 提问

在SOLARIS   C++4。2下在一个类的成员里调用了一个线程,    
   
  int   baseClass::start()    
  {    
  ................    
  thr_id   =   pthread_create(&thread_id,   NULL,   thread_method,   NULL);    
  ........................    
  }    
   
  但必须把thread_method声明如下:    
  void   *thread_method(void   *arg)    
   
  如果声明为void   *   baseClass::thread_method(void   *arg)    
  就编译不过,我想把它作为成员函数,怎么办???不然破坏封装性   ,我还有子类需要  
  继承呢.  
   
  问题点数:20、回复次数:8Top

1 楼ecc(昏睡百年)回复于 2003-11-04 18:10:37 得分 0

不是很清楚   好像要   static   void   *.....Top

2 楼plainsong(短歌)()回复于 2003-11-04 18:22:09 得分 0

class   baseClass  
  {  
      virtual   void   execute()   =   0;  
      static   void   *   thread_method(void   *   arg);  
  ...  
  };  
   
  static   void   *   thread_method(void   *   arg)  
  {  
      ((baseClass*)arg)->execute();  
  ...  
  }  
   
  int   baseClass::start()    
  {    
  ................    
  thr_id   =   pthread_create(&thread_id,   NULL,   thread_method,   this);    
  ........................    
  }    
   
  Top

3 楼libad()回复于 2003-11-06 14:25:55 得分 0

失败了,提示头文件出错  
  Error:   Multiple   declaration   for   static   baseClass::thread_method(void*)  
  Top

4 楼libad()回复于 2003-11-06 14:43:41 得分 0

上面哪个错误是笔误,改正了后,有报:  
  ild:   (undefined   symbol)   static   baseClass::thread_method(void*)   --   referenced   in   the   text   segment   of   ../bin/baseClass.o  
  Top

5 楼plainsong(短歌)()回复于 2003-11-06 17:51:31 得分 20

把作用域声明给漏了:  
   
  static   void   *   baseClass::thread_method(void   *   arg)  
  {  
      ((baseClass*)arg)->execute();  
  ...  
  }  
   
  它是baseClass的静态成员,而不是全局函数。Top

6 楼xkak2(矗立云端)回复于 2003-11-06 18:00:01 得分 0

类的成员函数都有隐含的this指针,但是static成员函数没有,所以只需要用static成员函数就可以了。  
  另外,如果不想破坏封装,用namespace也是一个不错的选择。Top

7 楼libad()回复于 2003-11-07 09:12:01 得分 0

 
  改为static   void   *   baseClass::thread_method(void   *   arg)  
  {  
      ((baseClass*)arg)->execute();  
  ...  
  }  
   
  后报错:  
  Error:   "static"   is   not   allowed   here.Top

8 楼plainsong(短歌)()回复于 2003-11-07 14:53:06 得分 0

void   *   baseClass::thread_method(void   *   arg)  
  {  
      ((baseClass*)arg)->execute();  
  ...  
  }  
   
  最近状态不好,总犯这种错误。Top

相关问题

  • 在线程函数中调用CoInitializeEx编译出错
  • 关于线程创建函数的一个简单问题(编译未通过)
  • 线程函数 提问
  • 线程函数问题?
  • 我的一个线程函数必须做成static的,但我想在这个函数里调用其他的成员函数(非static的),这时编译通不过了。我该怎么做呢?
  • 我的一个线程函数必须做成static的,但我想在这个函数里调用其他的成员函数(非static的),这时编译通不过了。我该怎么做呢?
  • 构造函数编译错误
  • 关于函数SHGetFolderLocation的编译错误
  • CreateTimerQueueTimer函数为什么无法编译?
  • 关于inline函数编译问题

关键词

  • 函数
  • null
  • baseclass
  • 成员
  • thread
  • pthread
  • arg
  • method
  • execute
  • static

得分解答快速导航

  • 帖主:libad
  • plainsong

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo