我的目標是我在標題中詢問的地方,我想調用者線程不會等待子線程創建和恢復時使用std ::線程ctor與線程函數(非空ctors)C++ 11推遲的「線程」創建(即指定線程函數,但不要等待創建物理線程)
當我嘗試使用線程函數在DLL加載期間創建一個std ::線程對象時,我的問題點擊(在Windows中)。 這是一個問題,因爲(就我而言) - 線程構造函數試圖創建一個物理線程 - Ctor不知何故(對我來說不幸)等待物理線程恢復(上線) - 不幸的是,Win API的確會如果線程在該函數調用期間創建,則不允許線程在LoadLibrary調用中恢復。 - 所以我有一個死鎖:LoadLibrary創建一個線程,它等待它恢復,Windows不會讓它恢復。我可以發明一些解決方案來解決這個問題(通過一個獨特的線程不使用std ::線程將構造額外的線程(std :: threads),但我然後錯過了使用「唯一」std ::線程爲我的線程需要:-))。 但是,如果std :: thread被指示不等待物理線程恢復(如果它是使用線程函數(或lambda或其他)構造的),那將是最好的。 有沒有辦法做到這一點,或者我應該去尋求解決辦法? 感謝
- 更多的情況時,一個需要同 在快速路徑,我可以創造(lazyly)一個std :: thread對象,發佈一些任務給它(很多任務potentiall),和繼續(在快速路徑)沒有被推遲!我可能不在乎孩子的線程真的在物理上被創建並恢復。 如果不能lazly已經在這樣的快速pathes或期間的DllMain等
您是否在DllMain中創建線程? – 2013-04-05 16:02:49
其實我是在一個DLL範圍的全局C++對象ctor中創建線程。我相信CRT做這些類型的工作人員的初始化從DllMain調用 – mami 2013-04-05 16:04:35
他們被稱爲「DllMain」甚至進入之前我會說。老實說,我建議你延遲創建線程直到'DllMain'返回後。從你的dll導出'initialize()'函數,並要求加載模塊來調用它(在加載dll後)。 'initialize()'函數將創建啓動線程的對象。 – 2013-04-05 16:05:54