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 _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost