考虑以下课程
class Foo
{
public:
void* func(void* arg)
{
// how to pass this function to pthread...?!
}
}
稍后我想将func()
传递给pthread_create()
,而不是函数:
int main()
{
char * msg = "Hi dude";
Foo * ins = new Foo();
pthread_t pt;
// how to pass ins->func instead of a function?
pthread_create( &pt, NULL, ins->func, (void*)msg );
}
提前致谢。
答案 0 :(得分:4)
“通常”方法是,将对象和所有函数参数打包到结构中,在堆上分配此结构,将此结构的实例传递给具有C绑定的函数,并让该函数调用对象成员函数:
struct wrap {
char * msg;
Foo ins;
wrap( char* m, const Foo& f ) : msg(m), ins(f) {}
};
extern "C" void* call_func( void *f )
{
std::auto_ptr< wrap > w( static_cast< wrap* >( f ) );
w->ins.func(w->msg);
return 0;
}
int main() {
wrap* w = new wrap( "Hi dude", Foo() );
pthread_t pt;
pthread_create( &pt, NULL, call_func, w );
}
答案 1 :(得分:4)
它不会像您尝试那样工作,因为 C ++成员函数获取this
- 作为第一个参数传递的对象的指针。如果处于C ++模式,这是由编译器隐式完成的。
但是,pthread_create()
是 C 功能。它的第三个参数是“指向一个以void *
为参数的函数的指针(并返回void *
)”。进入pthread_create()
后,没有this
,没有this
隐含地作为第一个参数传递的信息......并且成员函数的调用方式与它不同打算被称为 - 你遇到各种各样的麻烦。
这就是pthread_create()
仅适用于使用“C”链接的函数的原因:全局函数和静态成员函数(两者都不使用this
指针)。
托斯滕有一个很好的方法来解决这个限制。我只想详细说明问题的技术背景。
答案 2 :(得分:2)
一种方法是将函数声明为静态
#include <iostream>
#include <pthread.h>
class Foo {
public:
static void* func(void* arg) {
char *test = (char *) arg;
std::cout << test << std::endl;
}
};
int main() {
char * msg = "Hi dude";
Foo ins;
pthread_t pt;
pthread_create( &pt, NULL, ins.func, (void*)msg );
pthread_join(pt, NULL);
return 0;
}