Re: Accessing a thread's object
Ryan wrote:
I'm using boost::threads and trying to access the members of the
functor that I start the thread on and can't find information on how to
do it anywhere.
It took me a while to even figure out what was going on but eventually
I determined that creating a new thread actually just COPIES your
functor object. Therefore changing the object's member values from
within the thread has NO effect whatsoever on the object you used to
initiate the thread.
Basically what I'm doing is I create object A. Object A has the ()
operator that boost threads automatically start runnning.
I tell boost I want to start A on it's own thread.
A does some stuff (in this case 'A' is a thread dedicated to serving a
client and my program creates a new A for every client that connects so
that it can cater to everyone at once).
The problem is, if I then call A.getWhatever() it returns null because
everything that has been changed, to my absolute delight, has been
changed on the boost::thread's copy of A and completely ignored the one
I passed into the thread() function.
boost::thread makes a copy by default since it likes to manage the
lifetime of the function object and prevent its destruction before the
thread has ended. If you do
void f()
{
MyThreadObject mt;
boost::thread th( mt );
}
mt will be destroyed at the end of f() but unless a copy is made, the
thread will continue to access it, potentially overwriting the stack of
the caller.
If you really don't want a copy, use boost::ref:
boost::thread th( boost::ref( mt ) );
but now you'd have to make sure that mt stays alive until the thread is
done executing it.
You can use shared_ptr to automate that:
boost::shared_ptr<MyThreadObject> pmt( new MyThreadObject );
boost::thread th( boost::bind( &MyThreadObject::operator(), pmt ) );
Now the thread will manage its own copy of pmt, but you can still use
pmt->getWhatever (assuming appropriate locking.)
If you go with the last option, you can rename operator() to something
like 'run', if you like.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]