2013-07-15 68 views
1

如果在線程對象構造完成後沒有保證線程實際運行,我在documentation中找不到任何信息。換句話說,在線程構造函數完成之後,是否保證線程函數已被執行?一些參考將不勝感激。std ::線程構建和執行

回答

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項提供了這樣的保證。