On Wed, Jun 3, 2009 at 8:57 AM, Daniele Barzotti <daniele.barzotti@eurocomtel.com> wrote:
Ovanes Markarian ha scritto:
>
>     void io_worker_thread(void)
>     {
>     #if (WIN32)
>      CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
>     #endif
>
>      io_service.run();
>
>     #if (WIN32)
>      CoUninitialize();
>     #endif
>     };
>
>
> It is better to use at least RAII here. This approach is not exception
> safe and if io_service.run() throws an exception CoUnintialize() will
> not be called.

You're right!
But how can I adapt this code to use RAII?
Maybe is more simple to add a try-catch statement?

See the example I gave above using thread_specific_ptr.  thread_specific_ptr frees its objects when the thread exits and the example above works regardless of whether or not you are always only using COM from threads you've created manually. 

If you always create the threads manually and have control over their thread function, just declare a copy of my com_init class on the stack in the first line of your thread function.