Re: Creating threads in C vs C++
On Jan 9, 2:56 am, red floyd <no.spam.h...@its.invalid> wrote:
On 1/8/2010 4:08 PM, Ralph Malph wrote:
A static member function isn't strictly correct, the thread
function should be a C linkage (extern "C") free function.
This can still be a friend of the class.
That is correct.
Here is a fuller example:
extern "C" void* run_somefunction(void*);
void* run_somefunction(void* _tgtObject) {
my_data *my_args;
my_args = (my_data*) _tgtObject;
myclass* mc = my_args->b;
void* threadResult = mc->somefunction((void*) my_args);
return threadResult;
}
Don't use a C-style cast.
Better would be:
extern "C" void *threadfunc(void*);
class my_thread_class
{
// redacted
private:
friend void *threadfunc(void*);
void *my_threadfunc();
};
extern "C" void *threadfunc(void *param)
{
return static_cast<my_thread_class*>(param)->my_threadfunc;
}
You actually often need a double conversion when calling
pthread_create (and other, similar functions). Basically, if
you convert to void*, the only legal conversion is back to the
type you converted. And in the simplest case, you will have
just constructed a derived class (and have a pointer to it), but
will cast back to the base class, in order to call a virtual
function. So you need to ensure that the pointer you convert to
void* is a pointer to the base class, not to the derived class.
--
James Kanze