2012-01-22 2 views
0

일부 멀티 스레드 비디오 게임 코드를 만들고 있습니다. 코딩을 시작하기 전에 나는 멀티 스레드 게임 설계에 대한 막연한 Valve의 해결책을 설명하는 기사를 보았습니다. 기사에서 수집 한 핵심 개념은 스레드 동기화입니다. 이것이 Valve가하는 방법인지는 모르겠지만 각 스레드마다 게임 루프를 실행하는 것을 상상했습니다. 각 반복이 끝날 때 스레드는 일시 중지하고 다른 스레드가 현재 반복을 마칠 때까지 기다린 다음 공유 데이터를 동기화합니다. 나는 오버 헤드 외에이 관리 체계가 있다는 것을 알았습니다. 스레드가 완전히 비동기 적으로 작동하게하는 것은 다릅니다. 이 기사는 동기화를 위해 독점적으로 사용되는 스레드를 언급했지만 제대로 작동하려면 다른 솔루션을 얻으려고합니다. 이것은 내가 그것을 할 (시도)하는 방법입니다루핑 스레드 동기화

 // at end of loop on each thread... 
     sig_thread_done(); 

     while (!is_sync_done()) 
     { 
      PauseExecution(1); 
     } 

sig_thread_done 및 is_sync_done 모든 "스레드"의 목록을 제어하는 ​​또 다른 클래스의 함수 개체입니다. 이 함수는 다음과 같다 :

bool Core::IsFrameDone() 
{ 
    MutexLock lock(manager_mutex); 

    if (waiting_components == -1) 
    { 
     waiting_components = 0; 
     return true; 
    } 
    return false; 
} 

void Core::SignalFrameDone() 
{ 
    MutexLock lock(manager_mutex); 

    if (++waiting_components == (int)components.size()) // components == threads 
    { 
     //sync shared data... 
     waiting_components = -1; // -1 signifies that all threads have completed their iteration 
    } 
} 

문제는 빠른 스레드가 대기 루프를 종료하고 다른 스레드가 거기에 종료 할 수있는 기회를하기 전에 다시 주위에 돌아올 수 있다는 것입니다. 따라서 다른 스레드가 is_sync_done을 통해 exit를 놓치기 때문에 다른 스레드가 대기를 시작하고 전체 시스템이 영원히 기다리는 것을 멈추게됩니다.

이 문제를 해결하기위한 쉬운 방법을 찾을 수 없습니다. 일부 독립 스레드가 동기화를 수행하는 동안 동기화가 중단되지 않기 때문에이 접근 방식을 정말 좋아합니다.

누구나 제공하는 통찰력이나 제안에 감사드립니다.

Link to article.

+0

은 참조하는 기사에 대한 링크를 제안합니다. –

+1

개념적으로 장벽을 구현하려고합니다. 대신 테스트 된 구현을 사용하십시오. 'pthread_barrier'? –

+0

@AlexeyKukanov 감사합니다. 나는 그것을 들여다 볼 것이다. – Jim

답변

0

나는 당신이 Thread barrier를 다시 발명에 노력하고있다 생각합니다.

+0

다른 사람들이 말하는 것 같습니다. 나는 이전에 쓰레드 장벽에 대해 들어 본 적이 없었습니다.이 프로젝트를 시작하기 전에 더 많은 책을 읽었어야한다고 생각합니다. 댓글 주셔서 감사합니다. – Jim

0

장벽에서 Win32 이벤트 (또는 그 배열)와 동기화하려는 경우, 이렇게하면 설명 된 상황을 얻을 수 없습니다 (모든 장벽이 동일하게 동기화되도록 장벽이 보장됩니다.) 프레임) 동시에 이벤트 대기는 커널 신호로 수행되고 해당 신호가 수신 될 때까지 스레드를 대기 상태로 유지하므로 CPU 시간을 절약합니다. 또한 wait-free 알고리즘을 사용하는 것이 좋을 것입니다. 작업/태스크 기반 스레딩 모델이 있으면 시스템에서 특정 작업을 분리 할 수있는 경우 특히 유용합니다.

here 또한 원본 엔진의 멀티 스레딩에 대한 더 나은 게시물이며 훨씬 더 깊이 있고 기술적 인 내용을 담고 있습니다. 또한 이러한 종류의 뮤텍스를 피할 수 있다고 명시되어 있습니다.

+0

감사합니다. 전에 모든 스레드를 비동기 적으로 실행하고 필요한 경우 뮤텍스를 사용했습니다. 이렇게하면 모든 간헐적 인 동기화의 오버 헤드가 제거됩니다. – Jim