2012-07-13 9 views
7

は現在のスレッドがメインスレッドであるかどうかを検出するためにC++ 11で安心できますか?std :: threadはメインスレッドを検出します

bool isMainThread() 
{ 
    return theMainThreadIdISavedOnProgramStart == std::this_thread::get_id(); 
} 

これを行うための一般的な方法があります:または私は手動でstd::this_thread::get_id()でメインスレッドのスレッドIDを保存して、このようなルーチンを持っている必要がありますでしょうか?上記のソリューションは機能しますか?

ありがとうございました

+2

スレッドローカルストレージにフラグを設定することもできますが、この時点でTLSを広く使用できるかどうかはわかりません。 – dasblinkenlight

答えて

8

メインスレッドはどういう意味ですか? main()を実行するスレッドを意味する場合、スレッドがメインスレッドであるかどうかを知る方法はありません。あなたはそのIDを保存しなければなりません。 IDを保存しておけば、現在のスレッドがメインスレッドかどうかを知ることができます。

もう少し説明すると、あるスレッドが他のスレッドを作成しても、スレッドは階層を持たず、親スレッドも子スレッドもありません。 OSは、どのスレッドによって作成されたスレッドを記憶していません。したがって、すべてのスレッドはOSおよびプログラムと同じです。したがって、現在のスレッドがアプリケーション内の他のすべてのスレッドの親であるかどうかを検出することによって、mainスレッドを推論することはできません。

+1

説明に感謝します!私は本当にmain()を実行しているスレッドに気をつけます!私は手動でIDを保存します!ありがとうございました! – moka

+3

非常に正解です。 sidenoteとして、そしてプラットフォームによっては、FreeBSD、OpenBSD、Mac OS X、またはiOSを実行するPOSIXプラットフォームでは、pthread.hに関数があります。int pthread_main_np(void);これは、スレッドがメインスレッドであればゼロ以外を返します。 std :: threadを使ってスレッドを生成した場合、この基本関数は正しく動作します。関数の最後にある "np"は "非ポータブル"を意味するので、Nawazはプラットフォームに依存しない最良の答えを持っていることに注意してください。 – NSDestr0yer

関連する問題