2011-09-26 7 views
37

それはpthreadsのにマッピングする方法を簡単に確認C++ 11の新しいスレッドのものを見ている、私はthreadコンストラクタエリアで好奇心旺盛なセクションに気づく:C++ 11では、「実行スレッドを表していない」スレッドのポイントは何ですか?

スレッド();
効果:実行スレッドを表さないスレッドオブジェクトを構築します。
事後条件: GET_ID()== ID()
例外ない:何を。言い換えれば

、スレッドのデフォルトコンストラクタは、実際にスレッドを作成していないようです。明らかに、スレッドオブジェクト、が作成されますが、バッキングコードがない場合は、それがどの程度正確に役立ちますか? thrd.start()またはそれに類するもののような、そのオブジェクトに「実行のスレッド」を添付できる他の方法がありますか?

+0

C++ 11は、この時点であなたと私の両方をギョッとされます幸い私はもうカーネル開発者だからスタンダードはもう変わっていない:) –

+5

スレッドコンストラクタは実際のスレッドを作成せず、オペレーティングシステムを呼び出さず、スタックを割り当てない/その他のリソースであり、一般に停止したスレッドは作成されません。私はこれが適切な場所にあると思うので、スレッドを作成する前にスレッドを作成して(何らかのフラグストレージ以外で)何かを無駄にしていないことを人々は知っているでしょう。 – Dani

+5

@Jesus Ramos:カーネル開発者は標準的な変更を恐れていますか?私が正しく思い出すと、新しいプロセッサはそれぞれカーネル内で何かを破壊したり、実装するために多くの書き換えが必要な機能を追加します。 – Dani

答えて

34

thrd.start()などのようなオブジェクトに「実行のスレッド」を付けることはできますか?

// deferred start 
std::thread thread; 

// ... 

// let's start now 
thread = std::thread(functor, arg0, arg1); 

std::thread MoveConstructibleとMoveAssignableタイプです。つまり、std::thread zombie(some_functor); std::thread steal(std::move(zombie));zombieのようなコードでは、実行スレッドなしで特別な有効な状態になります。デフォルトのコンストラクタは、オブジェクトをその正確な状態に置くだけで済むので、ある意味で自由になります。 std::threadの配列とstd::vector<std::thread>::resizeのような操作も可能です。

+0

実際には、スレッドのスレッドIDは0になります。内部ネイティブスレッドコンテキストはありません。配列とstlコンテナのプレースホルダ型です。 – Noishe

3

単に推測しますが、スレッドが開始されていないことを意味します。言い換えれば、他のオブジェクトのようなオブジェクトにすぎません。実際のOSスレッドの後ろに必ずしもあるわけではありません。別の言い方をすれば、スレッドがpthreadの上に実装されている場合、C++ 11スレッドオブジェクトを作成しても、スレッドが開始されたときにのみ必要なpthread_create()が呼び出されるとは限りません。

+0

私の質問は、私の質問の第二の部分になるでしょう: "あなたはそれをどうやって始めますか?" – paxdiablo

+0

おそらくできません。結局のところ、引数のないコンストラクタを使用した場合、* do *のスレッドには何も指定していません。そういう意味で、なぜあなたはそのような無駄なオブジェクトを作ることができるのかという疑問につながります。 – davmac

+0

むしろ:Luc Dantonが以下の答えで指摘しているように、代入演算子を使ってスレッドを開始することができます。 – davmac

18

これは、これと同じことを意味します

std::vector<int> emptyList; 

emptyListは空です。ちょうどデフォルト設定のようにstd::thread。デフォルト設定のstd::ofstreamのようにファイルを開くことはできません。デフォルトが空の状態になるようなクラスを持つことは、理にかなった合理的な理由があります。


あなたは空のスレッドがある場合:あなたが実際にこれを行うことにより、スレッドを開始することができます

std::thread myThread; 

を:

fは、いくつかの呼び出し可能なものである
myThread = std::thread(f, ...); 

(関数ポインタ、ファンクタ、 std::functionなど)、および...は、スレッドに転送される引数です。

8

はちょうど推測されない:

"スレッドオブジェクトは" std::threadを指します。

「実行スレッド」は、OS's collection of hardware registers that represent a threadを指します。

C++ 11は、すべてのOSでC++スレッドを移植可能にするために、OSスレッドへのアクセスのためにOSのAPIをペーパリングしています。

スレッド();
効果:実行スレッドを表さないスレッドオブジェクトを構築します。
事後条件: GET_ID()== ID()
例外ない:何を。

これは、デフォルトで構築されたstd::threadが、OSが生成した実行スレッドを参照しないことを意味します。

std::threadが新たな価値を与え、ひいては移動代入文によって実行のOSスレッドを参照するために始めることができます。

std::thread t; // Does not refer to an OS thread 
//... 
t = std::thread(my_func); // t refers to the OS thread executing my_func 
関連する問題