
Sean Kelly wrote: [snip]
The user could delete the object passed to boost::thread with the existing design and there would be no provision for calling join. If this is enough of a concern, make the thread_base destructor a pure virtual function and document the need to call join.
Yes, but the user still has to know/remember that (s)he has to call join() in the derived class destructor and start() in the constructor. I think the boost::thread design is much less error-prone here. Plus, with the boost::thread design it is easy to avoid lifetime issues altogether: // untested code class MyActiveObject { public: void Run() { // ... } }; // ... boost::thread myThread( boost::function< void () >( boost::shared_ptr< MyActiveObject >( new MyActiveObject() ), &MyActiveObject::Run ) ); This will work even if you forget to call join() before destructing the thread object... Regards, Andreas