[英]Do C++11 threads provide a way for detached threads to continue after the main thread exits?
[英]C++11 threads, run on main thread
我正在嘗試使用C ++ 11線程進行一些開發。 我想在異步線程中運行一些代碼,當該代碼完成后,我想在主線程上運行其他代碼, 但是只有在完成后才可以!
這是因為我想異步運行的東西正在加載OpenGL內容,並且在執行線程時使用OpenGL上下文有點棘手,據我所知,在不同的線程中不要運行相同的上下文。
但是,我想創建一個加載程序線程,用於加載collada文件,這里耗時的東西實際上是解析文件並設置數據,而我可以(技術上)在單獨的線程中完成所有操作,然后執行opengl在主線程上的特定任務。 (這是我最初的想法,我可能會以錯誤的方式進行操作)。
因此,我在想,如果我可以分離一個異步線程來加載collada文件並填充數據,那么一旦完成,我將在主線程上調用以綁定緩沖區,設置着色器等。 我可以在不使用線程的情況下完成此操作,但是在后台加載新數據而不會導致GL異常運行會非常順利。
因此,我將嘗試整理我想做的步驟:
我確實將所有這些工作同步進行,一旦分離的異步線程完成,我想要的是一種做一些事情的方式。
任何想法或對我的思想的建設性批評: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>
),其中T
是load_meshes()
返回的類型。 。 否則,主線程將等待直到load_meshes()
完成(因此,就好像該函數在主線程中被調用一樣)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.