I have the following:
class DThread
{
virtual void run()=0;
_beginthreadex(NULL,0,tfunc,this,0,&m_UIThreadID); // class itself being passed as param to thread function...
static unsigned int __stdcall tfunc(void* thisptr)
{
static_cast<DThread*>(thisptr)->run();
return 0;
}
//other stuff
}
The run function is implemented in a derived class.
Why is the function that’s being called in the thread being called through a cast this pointer? Is this good practise?
Can’t it just be called directly?
The actual function needing to run is in the derived class.
My question is
Most platform-level thread APIs are bare-bones C and take a plain pointer to function to run in new thread. This means in C++ that function has to be either a free function or a static member. Neither of these give access to any class instance. The workaround for building statefull thread classes is to exploit additional “pass-through” argument of the thread creation call (that’s usually a pointer that is later passed to the function executed in the new thread) and give it a pointer to the class itself, i.e.
this. The static function could then call a [virtual] member, sayrun()or something like that.