2010-12-28 7 views
14

私は、単一のスレッドの実行をトレースするのが簡単であるように、ロギング時に簡単なIDでスレッドを識別できるようにしたい。 APIを使用しているウィンドウでは、GetCurrentThreadId()は私が望むものを達成することができます。 boost::threadにはメソッドget_id()がありますが、これは整数のような整数値ではありません。このオブジェクトは、私が欲しいと思われるIDを含むthread_dataメンバーを持っていますが、データメンバーはプライベートなのでアクセスできません。ブースト::スレッドからスレッドIDを取得するには?

表示または識別の目的でスレッドIDにアクセスするためのブースト方法は何ですか?

答えて

9

ブーストには、スレッドIDをストリームに書き込むために使用できるオーバーロードが含まれています(実際には、オーバーロードはテンプレートであり、std::ostreamだけでなく、std::basic_ostreamの任意の特殊化で動作します)。

異なるプラットフォームでスレッド識別子に異なる内部表現を使用する可能性があるため、idの出力結果はプラットフォーム固有の可能性があります。

+0

関数へのパラメータとして、出力ストリーム演算子で使用するboost :: thread :: idを渡しますか?ストリームやストリーム演算子を使用せずに値を使用できるようにするには、何を除いて近いと思いますか? – AJG85

+0

boost :: this_thread :: get_id()をスレッドワーカー関数内から使用すると、実際にsprintf_sスタイルの書式設定が必要なくなりました。 – AJG85

8

メンバー関数boost::thread::native_handle()を使用する必要があります。ネイティブスレッドIDの実装定義エイリアスであるタイプnative_handle_typeを返します。ネイティブスレッドIDはネイティブスレッドAPI関数で使用できます。遅すぎる

+0

私が必要とするすべてを知っておくと便利ですが、スレッドIDです。 boost :: threadを使用する主な理由は、私のケースでOS固有の呼び出しを避けることです。 – AJG85

+3

@ AJG85:...と 'nativehandle()'はあなたにそのような一意な識別子を*正確に*与えるでしょう。だから問題は何ですか?あなたはそれを他の目的に使う必要はありません。それは単にその価値が何を表しているのかの説明であった。実際には 'GetCurrentThreadId()'から得られるものとまったく同じ*です。重要なことに、この識別子はデバッガの* threads *ウィンドウに表示される識別子と同じであるため、その値が分かっていればマルチスレッドのデバッグに役立ちます。 – Clifford

+0

良い点。それがネイティブコールに使用できるという理由だけで、それがそれが唯一のものであることを意味するものではありません。また、GetCurrentThreadId()によって返された整数IDとは対照的に、GetCurrentThread()から取得するハンドルに相当すると考えています。 – AJG85

39

が、答えを探しているユーザーのために、ブーストは、単純に次のメソッドを呼び出して、あなたが言ったようにスレッドIDを相談することができます:

boost::this_thread::get_id() 

この方法は、ブーストから内部IDのタイプを返すことあなたが望むように数値ではありません。しかし、この数値を、例えば、IDが16進表現であることを考慮して、符号なしlongに簡単に変換できます。この小さな機能はデ仕事を行います。

4491075584 
4491612160 
4492148736 
4492685312 
4493221888 
4493758464 
4494295040 
4494831616 
4495368192 
4495904768 

boost_threadとboost_systemとのリンクを忘れないでください:

#include <boost/lexical_cast.hpp> 
#include <boost/thread.hpp> 

unsigned long getThreadId(){ 
    std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id()); 
    unsigned long threadNumber = 0; 
    sscanf(threadId.c_str(), "%lx", &threadNumber); 
    return threadNumber; 
} 

void drawThreadId(){ 
    std::cout << getThreadId() << std::endl; 
    boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 
} 

int main() { 
    for(int i=0; i<10; i++){ 
     boost::thread thread = boost::thread(drawThreadId); 
    } 
    return 0; 
} 

これは、このようなものを返します。

希望すると便利です。

+0

+1ありがとう、これは私が探していたものです! – Avio

+0

スレッドオブジェクトからIDを取得するにはどうすればよいですか? ( 'boost :: thread mythread') –

関連する問題