Boost logo

Boost Users :

Subject: Re: [Boost-users] passing pointer as function arg using boost::bind
From: Lee Clagett (forum_at_[hidden])
Date: 2014-03-20 23:45:07


On Thu, Mar 20, 2014 at 11:08 PM, Lane <
software.research.development_at_[hidden]> wrote:

> I'm having a problem passing a pointer as an arg via boost::bind and was
> hoping anyone could help out. I was able to pass 'a' just fine, but the
> second arg 'b' I'm having a problem with.
>
> Here is what I have.
>
> --
>
> namespace NS {
>
> class MyThread {
>
> int doIt(NS::A a, B *b);
>
> // ...
>
>
> A a;
>
> B *b = new B();
>
> NS::MyThread f_thread;
>
>
>
> boost::thread workerThread(boost::bind(&NS::MyThread::doIt, &f_thread,
>
> boost::ref(a), boost::ref(b)));
>
>
> Any help much appreciated.
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>

What exactly is the problem you are having? A compilation issue? A runtime
issue?

Various things that may help:

   - boost::ref() returns an object that has a reference to your object.
   That object has a conversion operator overload for returning a reference to
   the original type.
      - Using boost::ref() with a pointer would only be useful if the
      pointer address needs to be changed. That does not appear to be
the case in
      this situation.
      - Using boost::ref() with a function that copies its arguments is
      usually not going to do what you want (it will save one copy, if that was
      the goal).
   - The callback on boost::thread is launched asynchronously
      - Unlikely to be an issue since both are on the stack, but using
      boost::ref(a) means the object is never copied by boost::bind. So the
      reference must remain valid until boost::thread calls invokes boost::bind
      which will call your function (dolt). Since the function takes
the argument
      by copy, the stack object can be cleared after the call to dolt
is made (a
      bit precarious even with proper thread synchronization).
      - Boost::thread objects no longer automatically detaches joinable
   threads upon destruction.
   - A join or detatch must be done before destruction. It was not clear
      from the example whether this was being done.
      - Boost thread constructor can throw
      - Smart pointer usage is always encouraged, which is unlikely to be
      related to this issue but worth mentioning just in case.

Lee



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net