In the realm of multithreading, it's common to encounter the need to invoke member functions of a class within the thread's execution. However, this task can present challenges due to the hidden "this" parameter in C class member functions.
For instance, consider the following:
class C { void *print(void *) { cout << "Hello"; } };
Now, let's create a vector of C instances:
vector<C> classes; pthread_t t1; classes.push_back(C()); classes.push_back(C());
To create a thread that executes c.print(), you might intuitively write:
pthread_create(&t1, NULL, &c[0].print, NULL);
However, this will result in an error:
cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’
The issue arises because pthread_create() expects a function pointer of a specific type, whereas c[0].print is a pointer to a member function with a hidden "this" parameter.
To overcome this hurdle, you have two options:
A static class method does not have a "this" parameter and can be called directly without an instance of the class. Here's how you could implement a static class method for the hello function:
class C { public: static void *hello(void *) { std::cout << "Hello, world!" << std::endl; return 0; } };
Then, you can create a thread using the static class method:
pthread_create(&t, NULL, &C::hello, NULL);
Another option is to use a function pointer that encapsulates the member function and provides the "this" parameter explicitly. This function pointer can then be used to create a thread.
C c; pthread_create(&t, NULL, &C::hello_helper, &c);
where hello_helper is defined as:
void *hello_helper(void *context) { return ((C *)context)->hello(); }
By using a static class method or a function pointer, you can safely invoke member functions of a class within a thread, avoiding the "this" parameter issue.
The above is the detailed content of How Can I Safely Call C Class Member Functions from Threads?. For more information, please follow other related articles on the PHP Chinese website!