Creating Threads on Class Member Functions
When working with C classes, a common challenge is creating threads on member functions. Consider the following class:
class c { // ... void *print(void *){ cout << "Hello"; } }
Let's say we have a vector of c objects and want to create a thread on the c.print() function. However, the following code leads to an error:
pthread_create(&t1, NULL, &c[0].print, NULL);
The error message indicates that the function pointer does not match the expected type for the third argument of pthread_create().
Solution:
The error occurs because C class member functions have a hidden this parameter passed implicitly. pthread_create() doesn't know which instance of c to use for the this parameter. To resolve this, we need to use a static class method (which doesn't have a this parameter) or a plain function to bootstrap the class.
Static Class Method Approach:
class C { public: static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; // ... C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c);
This approach defines a static class method hello_helper(), which has no this parameter and wraps the call to the hello() member function.
Plain Function Approach:
void hello(void *context) { C *c = (C *)context; c->hello(); } // ... C c; pthread_t t; pthread_create(&t, NULL, &hello, &c);
Here, we define a plain function hello() that takes a void pointer passing to it and casts it to an instance of c. We then call the hello() member function on the c instance.
The above is the detailed content of How to Correctly Create Threads for C Class Member Functions?. For more information, please follow other related articles on the PHP Chinese website!