+ -
当前位置:首页 → 问答吧 → 线程函数可以是类成员函数吗?

线程函数可以是类成员函数吗?

时间:2010-08-15

来源:互联网

我看网上说
“问题的答案是肯定的:线程函数可以是类的成员函数。但是,必须定义为类的static成员函数。”
但是我在看一项目代码时候,它的线程函数就是类的普通成员函数:
int AAA::foo(ThreadInfo *thread)
它是在Channel对象的另一个函数里作为线程函数产生线程的:
void AAA::startfoo(){
            thread.data = this;
            thread.func = foo;
            if (!sys->startThread(&thread))
                        reset();
}
可见,其中参数Threadinfo中有个指针指向该AAA对象。

我的问题:
1.这是否就说明线程函数可以是类的非静态成员函数?
2.既然是非静态的,为什么不能直接在stream函数里调用类里的成员呢,而是要通过参数引用。 如果这个Channel是全局对象,就可以直接引用了吧,我记得线程是共享这些的

谢谢谢谢,实在没测试环境,加上好久没编程了,概念混淆还望学长指点下:)

作者: lknh17   发布时间: 2010-08-15

那只是因为你的例子中是封装过的,不是原始的线程。

作者: hellioncu   发布时间: 2010-08-16

不可以,非静态成员会隐含传递一个this指针,不能做thread函数

作者: sophic   发布时间: 2010-08-16

类的静态函数,本质是一个普通的函数,只不过放在这个类的名称空间下,可以访问这个类的名称空间的变量(就是静态变量)了。

因此线程的启动函数可以是类的静态函数。

作者: zzyong08   发布时间: 2010-08-16



QUOTE:
那只是因为你的例子中是封装过的,不是原始的线程。
hellioncu 发表于 2010-08-16 08:16




封装是因为要跨平台。而在linux下的实现就是直接调用pthread了

作者: lknh17   发布时间: 2010-08-16



QUOTE:
类的静态函数,本质是一个普通的函数,只不过放在这个类的名称空间下,可以访问这个类的名称空间的变量(就 ...
zzyong08 发表于 2010-08-16 09:00




    我的问题是能否访问非静态函数。。

作者: lknh17   发布时间: 2010-08-16



QUOTE:
不可以,非静态成员会隐含传递一个this指针,不能做thread函数
sophic 发表于 2010-08-16 08:19




    可是这个程序里确实是非静态的。难道是因为创建线程地方也在该类其他函数里才行的?

作者: lknh17   发布时间: 2010-08-16



QUOTE:
可是这个程序里确实是非静态的。难道是因为创建线程地方也在该类其他函数里才行的?
lknh17 发表于 2010-08-16 10:26




    线程入口必须是普通函数或者静态方法,当然封装的时候可以再在普通函数或者静态方法里调用特定对象的非静态成员函数

作者: hellioncu   发布时间: 2010-08-16

回复 lknh17


    不能,因为非静态函数的函数类型都是void* ClassName:: (*)(void *),而不是 void * (*)(void *)。静态函数可以,因为它的函数类型是 void *(*)(void *)

作者: zzyong08   发布时间: 2010-08-16