2016-06-24 8 views
0

私は、次のような実験でした:スレッドID割り当てはどのように整理されていますか?

#include <iostream> 
#include <thread> 

void t() 
{ 
    std :: cout << std :: this_thread :: get_id() << std :: endl; 
} 

void f() 
{ 
    std :: cout << std :: this_thread :: get_id() << std :: endl; 
} 

int main() 
{ 
    std :: cout << std :: this_thread :: get_id() << std :: endl; 

    for(unsigned int i = 0; i < 1000; i++) 
    { 
     std :: thread d(t); 
     d.join(); 

     std :: thread g(f); 
     g.join(); 
    } 
} 

をしてthread_id Sの結果のリストが常に同じになることに気づきました。言い換えれば、この場合、thread_idは、スレッドが結合されて再オープンされるたびに継続的に再割り当てされました。

ここで、いつもこれが起こるという確信はありますか?または、thread_idが1回だけ割り当てられた後、常に異なるthread_idがランダムな方法で割り当てられることがありますか?

+0

両方のスレッドを作成した後に結合を実行するとどうなりますか?あなたが参加すると、スレッドを終了します。 – NathanOliver

+0

私は唯一の保証は、2つのスレッドがIDが異なることがアクティブな場合だと思います。 IDの割り当てはおそらく実装に依存します。 – vu1p3n0x

+0

@ NathanOliver両方のスレッドが作成された後に参加すると、2つの値が交互に表示されます。すごくかわいい。しかし、フラットマウスが指摘するように、これはすべてのプラットフォームでは機能しません。 –

答えて

3

いいえ、あなたは常に同じであると想定できません。 VS2015で私は、次を得る:

... 
2444 
18472 
29912 
25180 
6612 
29440 
13220 
4684 
14004 
12388 
16424 
26320 
25948 
28076 
30904 
6396 
1160 
4228 
... 
+0

一口。別の方法を見つけなければならない!ありがとうございました! –

+0

ここにはショートカットがないことを悲しんでいます。私たちはすぐにそれを排除することができて幸せです。 :) – wally

0

いくつかのドキュメントがここにあります:http://en.cppreference.com/w/cpp/thread/thread/id

重点が鉱山

クラスのスレッドです:: idがとなって軽量、自明コピー可能クラスでありますstd :: threadオブジェクトの一意の識別子。

このクラスのインスタンスには、スレッドを表さない特別な個別値も保持されます。スレッドが終了すると、std :: thread :: id の値はとなり、別のスレッドによって再利用される可能性があります。

このクラスは、順序付けられていても順序付けられていない連想コンテナのキーとして使用するように設計されています。

関連する問題