Управление io_service в другом потоке, странная проблема с исключениями - PullRequest
0 голосов
/ 29 ноября 2010

Я некоторое время боролся с этой проблемой в своем приложении, поэтому я попытался воспроизвести проблему в простом фрагменте кода.

Я использую Boost 1.44 и mingw32-g ++ версии 4.4.1. на windows XP

Мой ожидаемый результат для следующей программы:

>messageservice.exe

[debug]BEFORE EXCEPTION ****
[error]EXCEPTION HANDLED ****
[debug]AFTER TRY/CATCH
>

Но на самом деле это иногда так и происходит, иногда выдает многословное «необработанное исключение win32 ...» (с отладчиком Just In Time), а иногда оно вылетает молча

Так что я в недоумении, почему он это делает.

Если я уберу блок try ... catch, программа будет работать нормально.

Вот код:

#include <iostream>
#include <string>

#include <boost/asio.hpp>
#include <boost/thread.hpp>


#define L_(lvl) std::cout<<"\n["<<#lvl<<"]"


void nothingfun() { } /* an empty job */

void threadfun() {
    boost::asio::io_service myIoService; /* thread's own io_service object */

    for(int i=0;i<10000;i++) {
        myIoService.post(&nothingfun);
    }
}


int main()
{
    boost::thread t(&threadfun);


    L_(debug)<<"BEFORE EXCEPTION ****";
    try{
         throw "aaah!";
    } catch(...) {
        L_(error)<<"EXCEPTION HANDLED ****";
    }
    L_(debug)<<"AFTER TRY/CATCH";

    t.join();

    return 0;
}

Является ли незаконным управление экземпляром io_service в неосновном потоке? или я сделал что-то ослепительно заведомо неправильное!?

Ценю любую помощь!

Спасибо

1 Ответ

1 голос
/ 29 ноября 2010

Спасибо Мэтту Грюнке за решение (http://news.gmane.org/gmane.comp.lib.boost.asio.user)

Очевидно, что наличие потоково-исключений является необязательным дополнением в mingw. Мне нужно было указать опцию -mthreads при связывании

Я думаю, что я наивен вдумая, что это должно быть постоянной гарантией ядра!

...