
On Wed, Jun 3, 2009 at 8:35 AM, Ovanes Markarian <om_boost@keywallet.com>wrote:
On Wed, Jun 3, 2009 at 3:21 PM, Daniele Barzotti < daniele.barzotti@eurocomtel.com> wrote:
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.
For per-thread COM Initialization in the presence of boost I almost always do the following: //Put in a widely visible header file somewhere struct com_init; extern boost::thread_specific_ptr<com_init> com_initialized; //In a CPP file somewhere boost::thread_specific_ptr<com_init> com_initialized; struct com_init { public: com_init() { CoInitialize(NULL); } ~com_init() { CoUninitialize(); } static void verify_com_init() { if (!com_initialized) com_initialized.reset(new com_init()); } }; For threads you create yourself, call com_init::verify_com_init() at the beginning of the thread function, for functions that run in threads you don't create, call com_init::verify_com_init() at the beginning of every invocation.