我正在製作一些多線程的視頻遊戲代碼。在我開始編碼之前,我看了一篇文章,模糊地描述了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返回false而錯過了退出,並且整個系統一直處於等待狀態。
我找不到解決此問題的簡單方法。我非常喜歡這種方法,因爲在某個獨立線程執行同步時,同步不會停止。
我很欣賞任何人都必須提供的見解或建議。
建議您鏈接到您正在引用的文章。 –
概念上,你試圖實現一個障礙 - 所以爲什麼不使用經過測試的實現,例如'pthread_barrier'? –
@AlexeyKukanov謝謝。我會研究它。 – Jim