- 论坛徽章:
- 0
|
原帖由 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; |
|