2015-11-22 46 views
5

當我們已經有一個std::thread類,那麼爲什麼我們需要std::this_thread命名空間?std ::線程類vs std :: C++中this_thread命名空間?

它們之間的基本區別是什麼?

什麼時候應該使用std::thread類,何時使用std::this_thread命名空間?

+4

如果只有這些地方的文檔... – juanchopanza

+0

因此,我想你已經閱讀[參考文檔](http://en.cppreference.com/w/cpp/thread)你應該看到它是從根本上不同'std :: thread'的功能。你能更具體一點嗎,請問你真的不清楚。 –

回答

5

this_thread命名空間組函數用於訪問當前線程,所以當我們需要在當前線程上執行某些操作時,我們不需要訪問線程的thread對象。

線程類不提供yielding和sleeping的訪問權限,這些函數只對當前線程有意義,因此可以在this_thread命名空間中找到。

如果我們希望獲得關於不同線程的信息,我們需要該線程的thread實例,如果我們需要訪問當前線程,我們總是可以通過this_thread命名空間中的函數來完成此操作。

使用一個this_thread命名空間中的思想也已經在擴展的草案解釋說:

this_thread命名空間

注意使用this_thread命名空間,當你請求消歧當前線程的id,與一個子線程的id。爲了減少界面的概念覆蓋範圍,此操作的get_id名稱保持不變。這種設計也適用於cancellation_requested功能:

std::thread my_child_thread(f); 
typedef std::thread::id ID: 

ID my_id std::this_thread::get_id(); // The current thread's id 
ID your_id my_child_thread.get_id(); // The child thread's id 

bool have_i_been_canceled = std::this_thread::cancellation_requested(); // Current thread's cancellation status 
bool have_you_been_canceled = my_child_thread.cancellation_requested(); // Child thread's cancellation status 

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2320.html

this_thread命名空間中的thread類的靜態成員可能已經完成添加的功能,但隨後get_id功能必須被稱爲別的東西,使其明顯不同於已有的線程類的get_id函數。換句話說,我的猜測是C++團隊決定將函數添加到一個單獨的名稱空間中,以便更清楚地表明這些函數正在讀取或操作當前線程,如果僅將它們添加爲靜態,那麼它們就不會一樣清楚線程類的成員。

2

std::thread用於創建,監控和操縱新主題
std::this_thread用於內部alreay創建的線程

你可以在std::thread的公共類中提供this_thread作爲靜態方法,但這是一個設計決定,我敢說這種設計更像Java,因爲封裝數據的命名空間更多C++ - pilosophy調整了一種設計。

相關問題