2011-11-17 1 views
1

스레드를 생성하는 응용 프로그램이 있고 들어오는 연결을 수신 대기합니다. 그리고 주 스레드는 다른 일을 할 것입니다.부스트 스레드 - join()없이 스레드 만들기

boost::mutex mutex; 
void 
ThreadFunction(int port, int(*callbackFunc)(int, int)) 
{ 
    mutex.lock(); 
    std::cout << "Cannot get to this point" << std::endl; 
    mutex.unlock(); 
    Application app; 
    app.run(port, callbackFunc); 
} 

void 
Init(int port, int(*callbackFunc)(int, int)) 
{ 
    std::cout << callbackFunc(1,1) << std::endl; 
    boost::thread t(boost::bind(&ThreadFunction, port, callbackFunc)); 
} 

int 
main(){ 
    int port = 2340; 
    Init(port, *callbackfunction); 
    return 0; 
} 

오전 데 문제는 내가 스레드를 만든 후()에 가입 호출하는 경우, 그것은 잘 작동하지만 다음 응용 프로그램을 차단하고, 그러나 std::cout << "Cannot get to this point" << std::endl;에 액세스하지 못할 것입니다.

스레드가 ThreadFunction을 호출하기 위해 수행해야하는 작업은 무엇입니까?

+0

표준에 따르면'terminate()'는'std :: thread'가 파괴 될 때 호출 될 것이라고합니다. Boost의 구현은 대신'detach()'를 호출하지만 미래의 표준을 따르기 위해 바뀔 수 있으므로 그렇게 범위를 벗어나는 것은 좋은 생각이 아닙니다. –

답변

3

스레드가 작업을 수행하기 전에 응용 프로그램이 종료됩니다 (main()를 벗어남). 일단 연결 대기 루프를 구현하면 문제가 해결됩니다. 따라서 아무 것도 할 필요가 없습니다.

+0

또 다른 간단한 질문은 Application :: run() 메서드를 호출 할 때 들어오는 연결을 수신하는 중입니다. 내가 서버를 시작하기에 충분한 시간을주지 않고서 종료하고 있습니까? 보조 스레드가 차단 되어도 응용 프로그램이 계속 실행됩니까? – Takashi

+0

@ Takashi-kun : 응용 프로그램은 누군가가'exit'를 호출하자마자 종료 할 것입니다. – thiton