免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: lsupper
打印 上一主题 下一主题

`void*(teststatic::)(void*)' does not match `void*(*)(void*)' 这个是什么情况? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-03-20 14:15 |只看该作者
原帖由 hellioncu 于 2009-3-20 11:56 发表
pthread_create里面不能用对象的方法,用普通的函数


这么说不完全准确,成员函数中的静态函数可以作为pthread_create的函数指针.

论坛徽章:
0
12 [报告]
发表于 2009-03-20 14:49 |只看该作者
原帖由 converse 于 2009-3-20 14:15 发表


这么说不完全准确,成员函数中的静态函数可以作为pthread_create的函数指针.

总结了:

原因:
类里的非静态函数函数地址是不固定的;
pthread_create中需指定线程地址,因此怎么改都错;
类的成员函数,不能转换成void (*)(void *)类型。

解决:
1.把线程函数定义成类的静态函数。同时不能访问类的非静态成员变量,并且所有类的实例都有共同的该成员函数,对于NS中模拟300个该类的节点对象,并不太适合:)
2.把线程函数不定义成类成员函数,而是一个公共的函数,并且声明为该类的友员,否则无法访问类的非公有变量
      A.把函数定义为普通的全局函数,此时启动线程时可能会传参,如果传递的是this指针,则此方法不可行,因为C* 无法转换为void*
      B.把函数定义为静态的全局函数,其参数形式为void* func(void* arg), 启动语句为pthread_create(&id, NULL,func,this),在func内部实现类型转换C* agent = static_cast(arg);
         class *th = (class *)pvoid;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP