/ / Un thread più veloce blocca il thread più lento - c ++, windows, multithreading, prestazioni

Un thread più veloce blocca il thread più lento - c ++, windows, multithreading, prestazioni

Sto lavorando a un visualizzatore di nuvole di punti e il mio progetto si basa su due thread

  • il primo thread aggiorna i dati della nuvola di punti (circa 10 fps)
  • il secondo thread è un renderer D3D per rendere il punto impostato sullo schermo (circa 90 fps)

quindi il mio codice assomiglia a questo:

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);
}
}
}

Mi è stato detto che il secondo thread è molto di piùveloce del primo, quindi quando il primo è entrato nella sezione critica, il secondo è bloccato, quindi la finestra di rendering dovrebbe bloccarsi di tanto in tanto. ma quello che ho notato in questo momento è che la finestra del renderer gira molto liscia, ruotare la fotocamera o ingrandire / rimpicciolire, tutto bene, ma il primo thread è molto instabile, i suoi fps vanno da 10 fps a 1 fps.

Sto pensando a due cloud buffer punto, quindi il primo thread aggiorna il secondo buffer quando si trova all'esterno della sezione critica, quindi scambia due buffer all'interno della sezione critica. Funzionerà?

risposte:

0 per risposta № 1

Come menzionato in Questo, CRITICAL_SECTION non fornisce il primo ingresso,ordinamento first-out (FIFO). dato che il secondo thread è molto più veloce del primo thread, e il suo intero ciclo è una sezione critica, entrerà nella sezione critica subito dopo averlo lasciato. Questo può sempre essere nella sezione critica e tenere il primo fuori da esso.

la mia soluzione è di mettere più lavoro del secondo thread al di fuori della sezione critica, quindi funziona bene.