0

私は、c++ 0x (C++11) に存在するマルチスレッドの新しいサポートを経験していました。

そのため、スレッドごとに std::thread:id 型の一意の識別子があります。

以下のサンプル プログラムを検討してください。

void hello_world()
{
  std::cout<<"hello_world \n";
}

int main()
{

    std::cout<<"Main thread id is "<<std::this_thread::get_id()<<"\n";

    std::thread t(hello_world);

    std::cout<<"Child thread id is ";
    std::cout<<t.get_id()<<"\n";
    t.join();
}

次のようなサンプル出力が得られました。

メインスレッド ID は 140502917359424 です

子スレッド ID は 140502900623104 です

こんにちは世界

サンプル出力のメイン スレッドのスレッド ID は、子スレッド ID のスレッド ID より大きくなっています。

スレッド ID は、開始時刻とは完全に独立していますか?

そうでない場合: スレッド T1 がスレッド T2 よりも早く開始されたかどうかをスレッド ID だけで区別する方法はありますか?

4

2 に答える 2

8

std::thread::get_id()は単なる任意の値であり、その唯一のプロパティは、現在実行中の各スレッドに対して一意であることが保証されていることです (ただし、スレッドが終了すると、その ID は再利用できます)。

どのスレッドが最初に開始されたかを知るには、自分で行う必要があります。カウンターを維持し、クラスで両方をラップするか、値をスレッド関数に渡すか、スレッドローカルストレージを使用することにより、何らかの方法で値をスレッドに関連付けます...あなたはアイデアを得る.

おそらく、一連のスレッドの相対的な作成順序を知ることは通常無意味だからです。あなたは彼らに火をつけて、彼らに仕事をさせてください。

于 2013-03-17T11:22:54.190 に答える
3

スレッドIDとスレッド作成の間に厳密な関係はあり得ません。スレッドは他のスレッドによって作成されるため、この作成は潜在的に並行して行われます。通常、スレッドIDは、スレッドの内部状態への(再解釈された)ポインターにすぎないため、スレッドIDに何も解釈しようとしないでください。

于 2013-03-17T13:22:55.373 に答える