2012-01-22 76 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返回false而錯過了退出,並且整個系統一直處於等待狀態。

我找不到解決此問題的簡單方法。我非常喜歡這種方法,因爲在某個獨立線程執行同步時,同步不會停止。

我很欣賞任何人都必須提供的見解或建議。

Link to article.

+0

建議您鏈接到您正在引用的文章。 –

+1

概念上,你試圖實現一個障礙 - 所以爲什麼不使用經過測試的實現,例如'pthread_barrier'? –

+0

@AlexeyKukanov謝謝。我會研究它。 – Jim

回答

0

我認爲你正試圖重新發明一個Thread barrier

+0

這似乎是其他人都在說的。我從來沒有聽說過線程障礙,我想我應該在開始這個項目之前做更多的閱讀。感謝您的評論。 – Jim

0

對於像這樣的事情,你想在屏障上同步,像Win32事件(或其數組),這確保你不能得到你描述的情況(屏障確保一切都同步到相同的),同時釋放CPU時間,因爲等待事件作爲內核信號完成,並休眠線程直到接收到該信號。你也可以在那裏使用免等待算法,如果你有一個基於工作/任務的線程模型,那麼這些工作特別有效,在這個模型中某些東西可以從系統中分離出來。

此外,here是一個更好的多線程源代碼引擎,它更深入和技術性更強(他們還特別聲明,它們避免了這類事物的互斥體)。

+0

謝謝。在我嘗試這個之前,我讓所有線程異步運行並在必要時使用互斥鎖。這將消除所有那些零星同步的開銷。 – Jim