Boost logo

Boost :

From: William E. Kempf (wekempf_at_[hidden])
Date: 2003-04-30 09:25:18


Jacques Kerner said:
> Hi,
>
> I get the following error :
>
> error C2664: 'void boost::function0<R,Allocator>::assign_to(Functor)' :
> unable to convert parameter 1 from 'const CTaskManager' to
> 'CTaskManager'
>
> when doing this :
>
> class CTaskManager
> {
> public:
> CTaskManager();
> ~CTaskManager();
> void operator()() {}
>
> private:
> boost::mutex m_mutex;
> }
>
> and
>
> CTaskManager taskManager;
> boost::thread_group mainThreadGroup;
> mainThreadGroup.create_thread(taskManager);
> mainThreadGroup.join_all();
>
> The error dissapears when I remove the mutex from the definition of
> CTaskManager ... (?!!)

Correct. Functors are passed by value (i.e. they must be Copyable), and
Mutexes are Noncopyable.

> So what is the right way to use mutex and threads together? Do I have to
> declare the mutex outside of the
> functor? Why?

No, you just have to enable the functor to be copyable, as per the FAQ at
http://www.boost.org/libs/thread/doc/faq.html#question5.

However, I'm going to guess from the code snippet that you really don't
want this functor to be copied? If that's the case, you may want to make
use of boost::ref.

CTaskManager taskManager;
boost::thread_group mainThreadGroup;
mainThreadGroup.create_thread(boost::ref(taskManager));
mainThreadGroup.join_all();

-- 
William E. Kempf

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk