On Wed, Jun 3, 2009 at 3:57 PM, 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?

Daniele.

Zachary's example does it. You can also use the shared_ptr do it locally in the function by passing the deleter function.

Or you just write your io_worker_thread() so:

void io_worker_thread()
{
#      if(WIN32)
        struct com_init
        {
             com_init() { CoInitializeEx(...); }
             ~com_init() { CoUninitialize(); }
        } initializer_object;
#      endif

       io_service.run();
}

That's it. ;)


Regards,
Ovanes