2013-02-16 4 views
0

C++ 루프에 관한 질문을 부스트.두 개의 스레드를 높이기

나는 할 수있는 한 많은 정보를 조사해 왔으며, 내가하려고하는 것의 어떤 예나 그것이 작동하는 원리를 보지 못했습니다.

저는 C++로 게임을 디자인하는 데 몇 년 동안 노력하고 있습니다. 나는 거친 Input 시스템뿐만 아니라 OpenGL과 AL을 사용하여 출력을위한 게임 로직을위한 핵심 엔진을 얻었습니다. 내가하고 싶은 일은 내 엔진을 시작하는 방법을 파악한 다음 입력 시스템, 그래픽 엔진 및 사운드 시스템을 별도의 스레드로 실행하는 것입니다. 모두 동시에 실행됩니다. 내 스레드 동기화는 다음 단계이지만 스레드를 함께 실행할 수는 없습니다.

boost::thread gTrd(boost::bind(&game::runGraphics, this)); 
gTrd.join(); 
boost::thread sTrd(boost::bind(&game::runSound, this)); 
sTrd.join(); 
boost::thread iTrd(boost::bind(&game::runInput, this)); 
iTrd.join(); 
boost::thread cTrd(boost::bind(&game::runCore, this)); 
cTrd.join(); 

그게 내가 지금까지 얻은 것입니다. 문제는 내가 볼 수있는 한 gTrd의 그래픽 엔진이 프로그램을 종료 할 때까지 계속 진행하는 무한 루프를 가지고있어서 빈 화면이 나타나지만 sTrd를 시작하지 않는다는 것입니다.

이론적으로 정의되지 않은 스레드에있는 스레드를 실행할 수 있도록 정확히 필요한 것은 무엇입니까? 또한 메모리 누수 측면에서 내가 알아야 할 잠재적 인 문제는 알아두면 대단합니다.

+0

그것은 보인다'runGraphics','runSound','runInput'는, 등등 동시에 실행되어야하지만 각()'다음을 시작하기 전에 .join'으로 완료 될 때까지 당신을 기다리고 있습니다. 아마도 모든 스레드를 시작한 후에 만'.join() '을 호출하기를 원할 것입니다. –

답변

1

join()은 무엇을 알고 있습니까? 이것을 호출하면 join을 호출 한 스레드가 끝날 때까지 주 스레드를 차단합니다. 코드에서 하나의 스레드를 시작하고 완료 될 때까지 대기하도록 조인을 호출 한 다음 다른 스레드를 시작하고이 프로세스를 반복합니다. 실행을 계속할 수 있도록 detach()을 호출하거나 스레드가 실행을 끝내면 언제든지 상관 없습니다. 필요에 따라 스레드를 모두 시작한 후에 join()을 호출하십시오.

참고 : 당신은 단지 당신이 스레드 완료 실행 때까지 기다려야 할 때 가입 전화를 걸.

+0

TY detach() 문은 내가 말할 수있는 한 작동합니다. 아직도 매우 골격 구조와 기능의 차이에 대한 정보를 주셔서 감사합니다. –

0

일단 실행을 멈 추면 모든 스레드는 join()이어야합니다. 앞에서 말했듯이 각 스레드는 일종의 무한 루프로 실행되기 때문에 스레드가 실행을 중지하기 전에 join()을 호출 할 때 주 스레드는 절대로 실행을 재개하지 않습니다.

대신에 스레드가 실행을 끝내기를 기대하는 스레드에게 알려야합니다.

RunGame() 
{ 
    initialize_all_threads(); //just like your sample code does minus the join functions 
    ...//do stuff while game is running 
    wait_for_quit_signal_from_input_thread(); //note that the input thread is the only thread which transfers messages back to the main thread 
    //quit signal received, so we should quit game 
    signal_all_threads_exit(); //via some kind of flag/synchronization object which all thread "main loops" are listening on 
    join_all_threads(); //wait for threads to gracefully end, perhaps with a timeout 

} 
0

이유는 단지 어쨌든) (모든 가입 덤프하지 : 다음은 간단한 메커니즘은 당신이 원하는 않는, 의사 코드에서입니까?

boost::thread gTrd(boost::bind(&game::runGraphics, this)); 
boost::thread sTrd(boost::bind(&game::runSound, this)); 
boost::thread iTrd(boost::bind(&game::runInput, this)); 
game::runCore(); 
관련 문제