2010-11-29 3 views
0

응용 프로그램에서이 문제를 해결하기 위해 고심하고 있으므로 간단한 코드 조각으로 문제를 재현하려고했습니다.다른 스레드에서 io_service 관리 예외가있는 이상한 문제

부스트 1.44 및 mingw32-g ++ 버전 4.4.1을 사용 중입니다. 윈도우 XP에

다음 프로그램에 대한 나의 예상 된 결과는 다음과 같습니다

>messageservice.exe 

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

그러나 때때로이 작업을 수행 현실에서, 때때로 (그냥 시간 디버거) "... 처리되지 않은 win32에서 예외"자세하게 충돌, 때로는 자동으로 충돌이 발생합니다.

그래서 나는 왜 이런 일을 저질렀습니다.

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 인스턴스를 관리하는 것은 불법입니다 : 여기

코드인가? 또는 내가 뭔가 blindingly 분명히 잘못 했어!?

감사합니다.

감사

는 솔루션 (http://news.gmane.org/gmane.comp.lib.boost.asio.user)를위한 매트 Gruenke에
+0

Win XP, Boost 1.44 및 Visual Studio 2008을 사용하여 충돌없이 코드가 실행됩니다. 이벤트 루프가 시작되지 않았으므로 io_service가 예제에서 아무 것도하지 않는다는 사실을 알고 있습니다 (io_service run() 호출 또는 run_once())? – nabulke

답변

1

감사

분명히 가진 스레드 안전 예외는있다 선택 사항 인 mingw. 링크 할 때 -mthreads 옵션을 지정해야했습니다.

저는 이것이 항상 핵심적인 보장이라고 생각합니다.