因此,我的 opengl 應用程式中有一個主應用程式執行緒,其中包含所有渲染和內容。現在我需要一些非常繁重的計算,大約需要 2 3 秒,所以我將它移到一個單獨的執行緒,這是我管理它的方式:
std::atomic<bool> working = false;
void work(){
if(!working)
{
working = true;
std::thread worker(do_work);
worker.detach();
}
else
{
// Some Updations
}
}
void do_work()
{
// The actual work
// working = false;
}
現在我每幀呼叫一次作業,一旦前一幀完成,實際作業就會自動調度。
現在我的問題是有什么方法可以優化它?我想到的一些想法是有一個執行緒池,但我不確定這是否值得麻煩實作?或者還有其他方法嗎?
uj5u.com熱心網友回復:
您可以按照某些人的建議使用 std::launch 。或者你可以在谷歌上搜索“c 執行緒池庫”,可能會發現一些東西在等著你。
但現實很簡單:撰寫執行緒池幾乎是微不足道的,是一個很好的練習。因此,您可以自己撰寫并學習一些東西。正如建議的那樣,您可以通過某種訊息佇列進行調度。
作業佇列可以是任何型別的互斥體和 cond_var - 管理的 FIFO,然后您可以擁有多個讀取器和多個寫入器。佇列中的條目可以是任何型別的可運行或系結函式(例如 lambda)。
寫起來很有趣,你可以在未來幾年里扔進你的個人圖書館。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/442895.html
上一篇:取消未來與停止執行緒
