/ / Um segmento mais rápido bloqueia thread mais lento - c ++, windows, multithreading, performance

Um encadeamento mais rápido bloqueia um encadeamento mais lento - c ++, windows, multithreading, performance

Eu estou trabalhando em um visualizador de nuvem de pontos, e meu design é baseado em dois segmentos

  • primeiro thread atualiza os dados da nuvem de pontos (cerca de 10 fps)
  • segundo thread é um renderizador D3D para renderizar o conjunto de pontos para a tela (cerca de 90 fps)

então meu código é assim:

std::shared_ptr<PointCloud> pointcloud;
CRITICAL_SECTION updateLock;
void FirstThreadProc()
{
while(true)
{
/* some algorithm processes point cloud, takes time */
EnterCriticalSection(&updateLock);
pointcloud->Update(data,length,...); //also takes time to copy and process
LeaveCriticalSection(&updateLock);
}
}
/*...*/
std::shared_ptr<D3DRenderer> renderer;
void SecondThreadProc()
{
MSG msg = { 0 };
while (WM_QUIT != msg.message)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
EnterCriticalSection(&updateLock);
renderer->Render(pointcloud);
LeaveCriticalSection(&updateLock);
}
}
}

Eu pensei que o segundo segmento é muito maismais rápido que o primeiro, então quando o primeiro entrou na seção crítica, o segundo é bloqueado, então a janela do renderizador deve congelar agora ou então. mas o que eu observei agora é que a janela do renderizador roda muito suavemente, rotação da câmera ou zoom in / out, tudo bem, mas o primeiro thread é muito instável, seu fps varia de 10 fps a 1 fps.

Eu estou pensando em dois buffers de nuvem de ponto, em seguida, primeiro thread atualiza o segundo buffer quando outsides a seção crítica, em seguida, trocar dois buffers dentro da seção crítica.

Respostas:

0 para resposta № 1

Como mencionado em esta, CRITICAL_SECTION não é fornecido em primeiro lugar,ordenação first-out (FIFO). já que o segundo thread é muito mais rápido do que o primeiro thread, e todo o seu loop é uma seção crítica, ele entrará na seção crítica logo após sair dele. Isso sempre pode estar na seção crítica e manter o primeiro fora dele.

Minha solução é colocar mais trabalho do segundo thread fora da seção crítica, então funciona bem.