2015-11-22 23 views
5

すでにstd::threadクラスがある場合、なぜstd::this_thread名前空間が必要ですか?std :: thread class vs std :: this_thread C++のネームスペース?

これらの基本的な違いは何ですか?

std::threadクラスはいつ使用しますか?std::this_thread名前空間はいつ使用しますか?

+4

これらのドキュメントがある場合は... – juanchopanza

+0

[参照ドキュメント](http://en.cppreference.com/w/cpp/thread)を読んでいると思いますが、それは基本的に'std :: thread'の機能です。あなたはより具体的になりますか、実際にあなたには分かりません。 –

答えて

5

this_thread名前空間グループは現在のスレッドにアクセスする関数なので、現在のスレッドで何か処理が必要な場合は、スレッドのthreadオブジェクトにアクセスする必要はありません。

スレッドクラスは降伏とスリープのためのアクセスを提供しません。これらの関数は現在のスレッドに対してのみ意味があり、したがって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

threadクラスの静的メンバーが行われている可能性がthis_thread名前空間から機能を追加したが、その後get_id機能がなければならないでしょう既に存在するスレッドクラスのget_id関数とは明確に区別するために、何か別のものと呼ばれることがあります。言い換えれば、私の推測では、C++チームは、これらの関数が現在のスレッドを読み込みまたは操作していたことをより明確にするために、関数を別の名前空間に追加することを決めたということです。スレッドクラスのメンバ

2

std::thread
std::this_thread新しいスレッドを作成、監視および操作するために使用されるalreay作成されたスレッド内部で使用されています。

std::threadのパブリッククラス内で静的メソッドとして提供することができましたが、これは設計上の決定です。このようなデザインはJavaのようなものであり、ネームスペースとしてデータをカプセル化する方が多くC++ - 哲学チューニングされた種類のデザイン。

関連する問題