Boost logo

Boost Users :

Subject: Re: [Boost-users] [ASIO] Where to use CoInitizeEx
From: Zachary Turner (divisortheory_at_[hidden])
Date: 2009-06-03 10:15:26


On Wed, Jun 3, 2009 at 8:57 AM, Daniele Barzotti <
daniele.barzotti_at_[hidden]> 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.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net