免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6439 | 回复: 9
打印 上一主题 下一主题

[C++] C++ 多线程编程问题: 在类中的线程函数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-14 20:03 |只看该作者 |倒序浏览
Hi 大家好!

   最近我涉及到Linux下多线程编程,我用C++语言,线程程序库是POSIX pthread.
我自己定义了一个类,线程函数和创建线程的函数都被封装在类中. 我用g++(3.4.2)编译它时,编译器提示错误:

ThreadFunctionInClass.cpp: In member function `void test::create_thread()'
ThreadFunctionInClass.cpp:20: error: argument of type `void*(test:(void*)' does not match `void*(*)(void*)'

如果我将线程函数 void *thread_function(void*){}放在类的外面就没有什么问题, 我不知道这到底是怎么回事. 我对C++的类型转换有点摸不着头脑。希望高手能给点指点,谢谢!

下面是我的程序代码:

#include <pthread.h>;

class test
{
        public:
                test(){}
                ~test(){}
                void *thread_function(void*){}
                void create_thread();
};

void test::create_thread()
{
        pthread_t thread;
       
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

        pthread_create(&thread, &attr, thread_function, NULL);

        pthread_attr_destroy(&attr);
}

int main()
{

        test testobj;

        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2005-07-14 20:15 |只看该作者

C++ 多线程编程问题: 在类中的线程函数问题

将void *thread_function(void*)定义为static类方法.

论坛徽章:
0
3 [报告]
发表于 2005-07-14 20:24 |只看该作者

C++ 多线程编程问题: 在类中的线程函数问题

如果一定要将线程函数thread_function定义为类函数的话,必须将其定义为类方法,即static方法,并在调用pthread_create作以下修改,以保证指针类型匹配.

  1. #include <pthread.h>;

  2. class test
  3. {
  4.         public:
  5.                 test(){}
  6.                 ~test(){}
  7.                 static void *thread_function(void*){}
  8.                 void create_thread();
  9. };

  10. void test::create_thread()
  11. {
  12.         pthread_t thread;

  13.         pthread_attr_t attr;
  14.         pthread_attr_init(&attr);
  15.         pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  16.          
  17.         pthread_create(&thread, &attr, test::thread_function, NULL);

  18.         pthread_attr_destroy(&attr);
  19. }

  20. int main()
  21. {

  22.         test testobj;

  23.         return 0;
  24. }

复制代码

注意创建线程时传递给的线程函数的参数的形式.

论坛徽章:
0
4 [报告]
发表于 2005-07-14 20:34 |只看该作者

C++ 多线程编程问题: 在类中的线程函数问题

成员函数的指针和普通函数的指针之间无法进行类型转换.因为成员函数有一个隐含的this参数,普通函数没有,当定义为类方法时(static),不传递this指针,这也是可以进行类型转换的原因.记得MSDN的c++参考中有专门的介绍,我现在手头没有,没法贴出来.

论坛徽章:
0
5 [报告]
发表于 2005-07-14 20:52 |只看该作者

C++ 多线程编程问题: 在类中的线程函数问题

谢谢restone9921的帮助。我虽然一开始也试了

      static void *thread_function(void*){}

但是不知为什么没有成功,我也忘了具体是怎么回事了。

自己的C++的基本功还是不行啊!

论坛徽章:
0
6 [报告]
发表于 2005-07-14 22:35 |只看该作者

C++ 多线程编程问题: 在类中的线程函数问题

不过这样起来的线程不能直接访问类中非静态成员,一般的作法是在需要启用该线程函数的类实例中,将this传给线程函数,以便线程函数可以访问该实例的成员。

论坛徽章:
0
7 [报告]
发表于 2005-07-15 09:15 |只看该作者

C++ 多线程编程问题: 在类中的线程函数问题

在类外面创建一个函数,并且定义成test的 friend

然后将this传给线程函数.

论坛徽章:
0
8 [报告]
发表于 2005-07-15 19:52 |只看该作者

C++ 多线程编程问题: 在类中的线程函数问题

请问哪里有关于c++的多线程编程方面的书籍和资料下载,推荐一下,谢谢!

论坛徽章:
0
9 [报告]
发表于 2005-07-15 22:17 |只看该作者

论坛徽章:
0
10 [报告]
发表于 2005-07-16 13:15 |只看该作者

C++ 多线程编程问题: 在类中的线程函数问题

void ThreadFun(void *pParam)
{
class_name *pClass = (class_name *)pParam;
pClass->;Fun()
}

原帖由 "Huskier" 发表:
Hi 大家好!

   最近我涉及到Linux下多线程编程,我用C++语言,线程程序库是POSIX pthread.
我自己定义了一个类,线程函数和创建线程的函数都被封装在类中. 我用g++(3.4.2)编译它时,编译器提示错误:

ThreadFuncti..........
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP