C++でスレッドIDを取得する方法

C++でスレッドIDを取得する方法

Posted at May 11,2017 12:03 AM
Tag:[C/C++]

C++でスレッドIDを取得する方法を紹介します。

1.問題点

C++11で実装されたstd::threadを使ったプログラムを作ってみました。

sample.cpp

#include <cstdlib>
#include <iostream>
#include <thread>
 
void task1(const std::string msg) {
    std::cout << "task1:" << msg << std::endl;
}
 
void task2(const std::string msg) {
    std::cout << "task2:" << msg << std::endl;
}
 
int main(int argc, char **argv) {
    std::thread t1(task1, "Hello World!!");
    std::thread t2(task2, "Hello World!!");
    t1.join();
    t2.join();
    return 0;
}

このプログラムで、各スレッドのスレッドIDを調べたいのですが方法が分かりません。

ということで、C++でスレッドIDを取得する方法を紹介します。

2.スレッドIDを取得する

スレッドIDを取得するには、task1()およびtask2()にstd::this_thread::get_id()を追加します。

...(略)...
void task1(const std::string msg) {
    std::cout << "task1:" << msg << std::endl;
    std::cout << "task1 thread:" << std::this_thread::get_id() << std::endl;
}
 
void task2(const std::string msg) {
    std::cout << "task2:" << msg << std::endl;
    std::cout << "task2 thread:" << std::this_thread::get_id() << std::endl;
}
...(略)... 

実行結果(実行結果はスレッド動作に依存します)

% ./a.out
task2:Hello World!!
task1:Hello World!!
task2 thread:140031416473344
task1 thread:140031424866048

main()で各スレッドのスレッドIDを取得したい場合は、次のようにします。

...(略)...
int main(int argc, char **argv) {
    std::thread t1(task1, "Hello World!!");
    std::thread t2(task2, "Hello World!!");
    std::cout << "main thread:" << std::this_thread::get_id() << std::endl;
    std::cout << "t1 thread:" << t1.get_id() << std::endl;
    std::cout << "t2 thread:" << t2.get_id() << std::endl;
    t1.join();
    t2.join();
    return 0;
}

実行結果(実行結果はスレッド動作に依存します)

% ./a.out
main thread:140046616794944
task2:Hello World!!
task1:Hello World!!
t1 thread:140046599993088
t2 thread:140046591600384

上の例では直接出力しましたが、スレッドIDを変数に代入する場合は次のように記述します。

自分のスレッドIDを変数に保持

std::thread::id this_id = std::this_thread::get_id();

スレッドオブジェクトのスレッドIDを変数に保持

std::thread t1;
std::thread::id this_id = t1::get_id();

3.参考サイト

参考サイトは下記です。ありがとうございました。

関連記事
zenback
人気エントリー
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)