如果在線程對象構造完成後沒有保證線程實際運行,我在documentation中找不到任何信息。換句話說,在線程構造函數完成之後,是否保證線程函數已被執行?一些參考將不勝感激。std ::線程構建和執行
1
A
回答
9
不,不能保證線程在std::thread
構造函數完成時開始執行。所有可以保證的是它被調度執行,所以在調用構造函數之後的某個點,線程將運行,並且在相關的std::thread
對象返回join()
的調用之前將會完成。
2
從C++ 11,30.3.1.2/4,關於thread
構造你提到:
template <class F, class ...Args> explicit thread(F&& f, Args&&... args);
效果:構造
thread
類型的對象。執行的新線程執行INVOKE (DECAY_COPY(std::forward<F>(f)), DECAY_COPY(std::forward<Args>(args))...)
,並在構造線程中調用DECAY_COPY
進行評估。此調用的任何返回值都會被忽略。
4
是有保證的線程功能已經被線程構造後執行完畢
C++標準不能要求這一點。
它取決於操作系統,其進程調度程序和當前系統負載。有時線程在構造函數返回時開始執行,有時不會。
它有可能爲新線程讓父線程知道它是否已經開始使用IPC執行,例如信號,管道或互斥鎖和條件變量。
1
「running」是什麼意思?保證 參數將被複制,並且至少在大多數系統上,複製必須發生在新創建的線程中。但那 沒有多大意義。對此,什麼是重要的? 在你從構造函數返回之前,新創建的線程執行單機 指令?它 已經執行完整的C++語句?或者是什麼?
1
不能有在C++標準如此出示擔保,作爲創建的線程將被放到調度的運行隊列,並最終被執行(取決於優先級和操作系統正在處理這些事情的方式) 。
事實上, 20也不是章。 C++標準中有30項提供了這樣的保證。
相關問題
- 1. std ::線程何時執行線程?
- 2. 構建一個std ::線程與功能
- 3. C + + std ::線程在執行時崩潰
- 4. std :: async將異步創建和執行的最大線程數是多少?
- 5. C++線程的執行時間和執行線程在另一個線程
- 6. 的std ::線程類的構造函數和析構函數
- 7. std ::線程和std ::互斥問題
- 8. C++線程不執行
- 9. 的Windows線程(C運行時,並行線程,的std ::線程)
- 10. 使用clr和std ::線程
- 11. 線程執行
- 12. 執行線程在c + +
- 13. std ::線程移動構造函數
- 14. 並行執行和終止多線程
- 15. 執行std :: is_class
- 16. 瞭解多線程和執行過程
- 17. C + + 11:std ::線程內執行一個函數成員與線程初始化在構造函數
- 18. 多線程程序只執行最後創建的線程?
- 19. 線程創建(分離)從未執行
- 20. 自動執行Android構建過程
- 21. std :: thread在主線程上執行回調函數
- 22. 線程和塊的限制以及線程和塊的執行
- 23. 執行線程onSensorChanged
- 24. 線程不執行
- 25. .net線程執行
- 26. 而線程執行
- 27. 在構建過程中選擇性地執行構建任務
- 28. 多線程執行寫入?
- 29. Python線程沒有執行所有創建的線程
- 30. boost ::線程執行順序