今回はVisual C++限定の話です。VC++のstd::thread::id型オブジェクトは、boost::lexical_castで整数型に変換できます。Windows APIなどに渡す場合に使えます。

#include <iostream>
#include <thread>
#include <windows.h>
#include <boost/lexical_cast.hpp>
 
int main()
{
  std::thread t([]{});
 
  auto id1 = boost::lexical_cast<DWORD>(t.get_id());
  auto id2 = GetThreadId(t.native_handle());
 
  std::cout << "thread::id " << id1 << std::endl;
  std::cout << "GetThreadId " << id2 << std::endl;
 
  t.join();
}

get_idメンバ関数はstd::thread::id型のオブジェクトを返します。ここからWindows APIで使えるDWORD型の値をなんとか取り出したかったのです。

そこで目を付けたのが<<演算子です。標準規格でstd::thread::idの出力結果は規定されていませんので、実際にVC++で試してみました。すると、WindowsのスレッドIDの十進法表現でした。これならboost::lexical_castで数値型に変換できるというわけです。Boostを使わず標準ライブラリだけで済ますことも可能です。この場合、ostringstreamとstoul関数を使います。

#include <iostream>
#include <string>
#include <sstream>
#include <thread>
#include <windows.h>
 
int main()
{
  std::thread t([]{});
 
  std::ostringstream os;
  os << t.get_id();
  auto id1 = std::stoul(os.str());
  auto id2 = GetThreadId(t.native_handle());
 
  std::cout << "thread::id " << id1 << std::endl;
  std::cout << "GetThreadId " << id2 << std::endl;
 
  t.join();
}

なお、上記コードで比較対象に使用したGetThreadIdは、Windows Server 2003およびWindows Vista以上で使える関数です。Windows XPでは使えない惜しい関数です。と言っても、もはやWindows XPも引退しつつあるので、気にせず使える場合も多いことでしょう。

スポンサード リンク

この記事のカテゴリ

  • ⇒ VC++でstd::threadから数値のスレッドIDを取り出す