将类方法作为pthread启动函数传递

时间:2014-02-12 10:57:46

标签: c++ multithreading pointers

考虑以下课程

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 );
}

提前致谢。

3 个答案:

答案 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;
}