スレッドの識別

Sスティーブン

スレッドを識別するには、次のことを行う必要があります
。1)そのIDを取得して保存します。
2)スレッドで実行されている関数内で、スレッドのIDを再度取得し、保存されたIDと比較します。

例:http
//coliru.stacked-crooked.com/a/8f608dff835f96d0(プログラムはJosuttisの著書「TheC ++ Standard Library」、第2版からのものです。)

thread::id master_tid {};

/// declarations
void doSomething();


int main()  
{
   thread master {doSomething};
   master_tid = master.get_id();

   thread slave {doSomething};

   /// ...

   /// join with threads
   master.join();
   slave.join();

   cout << "done" << endl;
}


void doSomething()
{
   if (this_thread::get_id() == master_tid)
      cout << "master thread ..."
           << endl;
   else
      cout << "NOT master thread ..."
           << endl;

   /// ...
}

出力は次のとおりです。

master thread ...
NOT master thread ...
done

ただし、上記のスキームは、doSomething()関数の呼び出しとマスタースレッドのIDの保存の間に遅延がない場合にのみ機能します。

このような遅延が発生した場合、doSomething()関数は、実行時にマスタースレッドのIDが参照される変数にまだ保存されていないため、マスタースレッドと他の関数を区別できませ
例:http//coliru.stacked-crooked.com/a/0bff325f872ba9c2

thread::id master_tid {};

/// declarations
void doSomething();


int main()  
{
   thread master {doSomething};
   thread slave {doSomething};

   /// delay
   this_thread::sleep_for(seconds {1});

   master_tid = master.get_id();

   /// ...

   /// join with threads
   master.join();
   slave.join();

   cout << "done" << endl;
}


void doSomething()
{
   /// ...
}

ここで、遅延のため、出力は次のようになります。

NOT master thread ...
NOT master thread ...
done

したがって、このスキームを完全に機能させるにはどうすればよいでしょうか。メインスレッドと他のスレッドの間で通信するために条件変数を使用して、スレッドIDが保存されているかどうかを示す必要がありますか?

または、もっと簡単な方法はありますか?

イェンス

すべてのスレッドは、master_tidが割り当てられるまで待機する必要があります。sleep_forエラーが発生しやすく、最終的にプログラムのバグにつながる手動の代わりに、同期メカニズムを使用する必要があります。すべてのスレッドが条件を待機するようにしたい場合は、条件変数を使用できます。ただし、マスターとスレーブに異なる関数を渡すか、パラメーターを渡すだけです。

#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex m;
std::condition_variable cv;
thread::id master_tid {};
bool ready = false;

/// declarations
void doSomething() {
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{return ready;});

    // master_tid is now assigned
   if (this_thread::get_id() == master_tid)
      cout << "master thread ..."
           << endl;
   else
      cout << "NOT master thread ..."
           << endl;
}


int main()  
{
   thread master {doSomething};

   thread slave {doSomething};

    {
        std::lock_guard<std::mutex> lk(m);
        ready = true;
        master_tid = master.get_id();
    }
    cv.notify_all();

   /// ...

   /// join with threads
   master.join();
   slave.join();

   cout << "done" << endl;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

発信者の検出とスレッドの識別

分類Dev

ネットワークアドレスの識別

分類Dev

スレッドループでの同時実行性の識別の問題

分類Dev

Java 1.4でスレッドの一意の識別子を取得する

分類Dev

行の重複した識別子を持つスプレッドの使用

分類Dev

行の重複した識別子を持つスプレッドの使用

分類Dev

行の識別子が重複しているスプレッド

分類Dev

Eclipse Debug Perspectiveでスレッドを識別する方法は?

分類Dev

jvmtiでスレッドを一意に識別する方法

分類Dev

jvmtiでスレッドを一意に識別する方法

分類Dev

C#の識別子の@プレフィックス

分類Dev

マルチプロセッシングプールワーカーのスレッド識別子

分類Dev

メールアドレス以外のiCloudID識別子?

分類Dev

アドレス間隔識別子(ASID)の目的

分類Dev

IPアドレスファミリの識別

分類Dev

一意のスレッド識別子を取得するにはどうすればよいですか?

分類Dev

Rスプレッドエラー:行の識別子が重複しています

分類Dev

NATはどのようにして着信パケットアドレスを識別しますか?

分類Dev

Python3のconcurrent.futuresスレッドプールを使用したスレッド実行関数の識別

分類Dev

別のJavaスレッドでのOutOfMemoryError

分類Dev

OpenGL:別のスレッドのglClientWaitSync

分類Dev

別のスレッドのstartActivty

分類Dev

別のスレッドのstartActivty

分類Dev

別のスレッドでのOpenGL描画

分類Dev

別のスレッドのPlaySound

分類Dev

別のスレッドのSetThreadExecutionState

分類Dev

スウィズルメソッド内のメソッド名の識別

分類Dev

別のスレッドで購読BehaviorSubject

分類Dev

RaisePropertyChangedと別のスレッド

Related 関連記事

  1. 1

    発信者の検出とスレッドの識別

  2. 2

    ネットワークアドレスの識別

  3. 3

    スレッドループでの同時実行性の識別の問題

  4. 4

    Java 1.4でスレッドの一意の識別子を取得する

  5. 5

    行の重複した識別子を持つスプレッドの使用

  6. 6

    行の重複した識別子を持つスプレッドの使用

  7. 7

    行の識別子が重複しているスプレッド

  8. 8

    Eclipse Debug Perspectiveでスレッドを識別する方法は?

  9. 9

    jvmtiでスレッドを一意に識別する方法

  10. 10

    jvmtiでスレッドを一意に識別する方法

  11. 11

    C#の識別子の@プレフィックス

  12. 12

    マルチプロセッシングプールワーカーのスレッド識別子

  13. 13

    メールアドレス以外のiCloudID識別子?

  14. 14

    アドレス間隔識別子(ASID)の目的

  15. 15

    IPアドレスファミリの識別

  16. 16

    一意のスレッド識別子を取得するにはどうすればよいですか?

  17. 17

    Rスプレッドエラー:行の識別子が重複しています

  18. 18

    NATはどのようにして着信パケットアドレスを識別しますか?

  19. 19

    Python3のconcurrent.futuresスレッドプールを使用したスレッド実行関数の識別

  20. 20

    別のJavaスレッドでのOutOfMemoryError

  21. 21

    OpenGL:別のスレッドのglClientWaitSync

  22. 22

    別のスレッドのstartActivty

  23. 23

    別のスレッドのstartActivty

  24. 24

    別のスレッドでのOpenGL描画

  25. 25

    別のスレッドのPlaySound

  26. 26

    別のスレッドのSetThreadExecutionState

  27. 27

    スウィズルメソッド内のメソッド名の識別

  28. 28

    別のスレッドで購読BehaviorSubject

  29. 29

    RaisePropertyChangedと別のスレッド

ホットタグ

アーカイブ