簡體   English   中英

C ++ 11線程,在主線程上運行

[英]C++11 threads, run on main thread

我正在嘗試使用C ++ 11線程進行一些開發。 我想在異步線程中運行一些代碼,當該代碼完成后,我想在主線程上運行其他代碼, 但是只有在完成后才可以!

這是因為我想異步運行的東西正在加載OpenGL內容,並且在執行線程時使用OpenGL上下文有點棘手,據我所知,在不同的線程中不要運行相同的上下文。

但是,我想創建一個加載程序線程,用於加載collada文件,這里耗時的東西實際上是解析文件並設置數據,而我可以(技術上)在單獨的線程中完成所有操作,然后執行opengl在主線程上的特定任務。 (這是我最初的想法,我可能會以錯誤的方式進行操作)。

因此,我在想,如果我可以分離一個異步線程來加載collada文件並填充數據,那么一旦完成,我將在主線程上調用以綁定緩沖區,設置着色器等。 我可以在不使用線程的情況下完成此操作,但是在后台加載新數據而不會導致GL異常運行會非常順利。

因此,我將嘗試整理我想做的步驟:

  1. 主線程繞着它做的事...
  2. 有人要求加載新的網格
  3. 通過創建異步線程並在其中加載collada數據初始化的網格
  4. 同時主線程繼續做它的東西
  5. 一旦完成了collada加載,異步線程就會通知主線程它希望在主線程上進行其他加載(即設置緩沖區等)。
  6. 設置完成,網格將自身添加到渲染隊列中

我確實將所有這些工作同步進行,一旦分離的異步線程完成,我想要的是一種做一些事情的方式。

任何想法或對我的思想的建設性批評:P都受到熱烈歡迎! 我可能會以錯誤的方式思考它,我一直在考慮做類似觀察者模式的事情,但是我真的不知道如何以最佳方式解決它。 我不介意將OpenGL東西穿線,但似乎有點像自找麻煩。

如果我正確理解了您的用例,那么我認為以std::launch::async策略開始的std::async()函數可以確保操作確實在另一個線程上啟動,它可以滿足您的要求:

// Your function to be executed asynchronously
bool load_meshes();

// You can provide additional arguments if load_meshes accepts arguments
auto f = std::async(std::launch::async, load_meshes); 

// Here, the main thread can just do what it has to do...

// ...and when it's finished, it synchronizes with the operation
// and retrieve its result (if any)

bool res = f.get(); // res will hold the return value of load_meshes,
                    // or this will throw an exception if one was
                    // thrown inside load_meshes()

if (res) 
{ 
    // ... and then it will go on doing the remaining stuff on the main thread
}

這里要注意的一件棘手的事情是,您應該始終將std::async()的返回值分配給某個變量(類型為std::future<T> ),其中Tload_meshes()返回的類型。 。 否則,主線程將等待直到load_meshes()完成(因此,就好像該函數在主線程中被調用一樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM