일부 멀티 스레드 비디오 게임 코드를 만들고 있습니다. 코딩을 시작하기 전에 나는 멀티 스레드 게임 설계에 대한 막연한 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를 놓치기 때문에 다른 스레드가 대기를 시작하고 전체 시스템이 영원히 기다리는 것을 멈추게됩니다.
이 문제를 해결하기위한 쉬운 방법을 찾을 수 없습니다. 일부 독립 스레드가 동기화를 수행하는 동안 동기화가 중단되지 않기 때문에이 접근 방식을 정말 좋아합니다.
누구나 제공하는 통찰력이나 제안에 감사드립니다.
은 참조하는 기사에 대한 링크를 제안합니다. –
개념적으로 장벽을 구현하려고합니다. 대신 테스트 된 구현을 사용하십시오. 'pthread_barrier'? –
@AlexeyKukanov 감사합니다. 나는 그것을 들여다 볼 것이다. – Jim