Angel.King.47 Angel.King.47 - 3 months ago 22
C++ Question

pthread function from a class

Let's say I have a class such as

class c {
// ...
void *print(void *){ cout << "Hello"; }
}


And then I have a vector of c

vector<c> classes; pthread_t t1;
classes.push_back(c());
classes.push_back(c());


Now, I want to create a thread on
c.print();


And the following is giving me the problem below:
pthread_create(&t1, NULL, &c[0].print, NULL);



Error Ouput: cannot convert ‘void* (tree_item::)(void)’ to ‘void*
()(void)’ for argument ‘3’ to ‘int pthread_create(pthread_t*, const
pthread_attr_t*, void* ()(void), void*)’

Answer

You can't do it the way you've written it because C++ class member functions have a hidden this parameter passed in. pthread_create() has no idea what value of this to use, so if you try to get around the compiler by casting the method to a function pointer of the appropriate type, you'll get a segmetnation fault. You have to use a static class method (which has no this parameter), or a plain ordinary function to bootstrap the class:

class C
{
public:
    void *hello(void)
    {
        std::cout << "Hello, world!" << std::endl;
        return 0;
    }

    static void *hello_helper(void *context)
    {
        return ((C *)context)->hello();
    }
};
...
C c;
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, &c);
Comments