免费注册 查看新帖 |

Chinaunix

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

[C++] 线程函数可以是类成员函数吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-15 21:52 |只看该作者 |倒序浏览
我看网上说
“问题的答案是肯定的:线程函数可以是类的成员函数。但是,必须定义为类的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是全局对象,就可以直接引用了吧,我记得线程是共享这些的

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

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2010-08-16 08:16 |只看该作者
那只是因为你的例子中是封装过的,不是原始的线程。

论坛徽章:
0
3 [报告]
发表于 2010-08-16 08:19 |只看该作者
不可以,非静态成员会隐含传递一个this指针,不能做thread函数

论坛徽章:
0
4 [报告]
发表于 2010-08-16 09:00 |只看该作者
类的静态函数,本质是一个普通的函数,只不过放在这个类的名称空间下,可以访问这个类的名称空间的变量(就是静态变量)了。

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

论坛徽章:
0
5 [报告]
发表于 2010-08-16 10:20 |只看该作者
那只是因为你的例子中是封装过的,不是原始的线程。
hellioncu 发表于 2010-08-16 08:16



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

论坛徽章:
0
6 [报告]
发表于 2010-08-16 10:21 |只看该作者
类的静态函数,本质是一个普通的函数,只不过放在这个类的名称空间下,可以访问这个类的名称空间的变量(就 ...
zzyong08 发表于 2010-08-16 09:00



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

论坛徽章:
0
7 [报告]
发表于 2010-08-16 10:26 |只看该作者
不可以,非静态成员会隐含传递一个this指针,不能做thread函数
sophic 发表于 2010-08-16 08:19



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

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2010-08-16 11:31 |只看该作者
可是这个程序里确实是非静态的。难道是因为创建线程地方也在该类其他函数里才行的?
lknh17 发表于 2010-08-16 10:26



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

论坛徽章:
0
9 [报告]
发表于 2010-08-16 12:50 |只看该作者
回复 6# lknh17


    不能,因为非静态函数的函数类型都是void* ClassName:: (*)(void *),而不是 void * (*)(void *)。静态函数可以,因为它的函数类型是 void *(*)(void *)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP