
Il 23/09/2010 11:18, Rutger ter Borg ha scritto:
Besides a possible race in your statement
thread_started = !thread_started;
and some other bad stuff such as memory leaks when throwing an exception, I don't see where the destructor of the work object is called. Could you provide the code involved?
Hi Rutger, thanks for your reply. Why ' thread_started = !thread_started; ' is a bad stuff? Now, when I crate an object that use io_service, I assign the pointer to io_service::work to a shared_pointer: typedef boost::shared_ptrboost::asio::io_service::work io_work_ptr; EXTERN_C DLL_EXPORT MyObjectHandle CALL GetMyObj() { if (!thread_started) { try { // create the work object on the heap p_work = new boost::asio::io_service::work(io_service); // run the IO service as a separate thread: io_service_thread.reset(new boost::thread(io_worker_thread)); thread_started = !thread_started; } catch (boost::thread_resource_error e) { // Failed to create the new thread return 0; } } // create the new object MyObject* pMyObject = new MyObject(io_service); // Assign a reference to io_service work object: // This reference is used to counting the objects created. // When the last MyObject is deleted the main work object // is destroyed and the io_service thread ends. pMyObject->_io_work_ptr.reset(p_work); // return the object return pMyObject; }; Mmmm, now I'm thinking about, I have this issue only if I create more than 1 object... Regards, Daniele.