今回は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++ ⇒ VC++でstd::threadから数値のスレッドIDを取り出す