2013-12-11 20 views
10

現在のスレッドがLinux上のメインスレッドであるかどうかを確認するにはどうすればよいですか? gettid()はpidだけを返しますが、linuxはmain()が常にconstと一様なpidを持つスレッドを保証していないようです。現在のスレッドがメインスレッドであるかどうかを調べる

これは、私は自動並列化が行われているため、pthread_create()がpthread_create()によって作成されたスレッドですでに実行されている関数で呼び出されないようにしたいと考えています。

+0

何が起こっているのか知っている合理的なコードを書いてみませんか?あなたは 'pthread_create'によって作成されたことを覚えていますか?これはちょうどブール値です –

+0

あなたはsyscall(SYS_gettid)を代わりに試しましたか? sys/syscallを含めてください。h – stackmate

答えて

10

getpid()た場合は、それがメインスレッドですgettid()と同じ結果を返します。 man gettidから

int i_am_the_main_thread(void) 
{ 
    return getpid() == gettid(); 
} 

gettid()呼び出し側のスレッドID(TID)を返す。シングルスレッドプロセスでは、スレッドIDはプロセスID(getpid(2)によって返されるPID)と等しくなります。マルチスレッドプロセスでは、すべてのスレッドが同じPIDを持ちますが、それぞれ には一意のTIDがあります。 man cloneから

スレッド・グループは、単一 PIDを共有するスレッドの集合の POSIXスレッドの概念をサポートするためにLinux 2.4に追加された機能でした。内部的には、この共有PIDは、スレッドグループのためのいわゆるスレッド グループ識別子(TGID)である。 Linux 2.4以降、getpid(2)を呼び出すと、呼び出し元のTGIDが返されます。

グループ内のスレッドは、 (システム全体)の一意のスレッドID(TID)で区別できます。関数の結果が のクローン()の呼び出し元に返され、スレッドがgettid(2)を使用して独自のTIDを取得できるように、新しいスレッドのTIDは です。

+0

ありがとう! Btw私はgettid()を使用しているLinuxマシンのサイドノートは定義されていません。私はget gettid()を置き換えるために '#include syscall(SYS_gettid);'を使って、今は動作していると言う別の投稿にあります! – user2958862

2

pthread_self()はどうですか?

これは、呼び出しスレッドのthread_idを返します。この関数を使用すると、メインスレッドID(メインであることが分かっている場合)を格納し、後でpthread_self()から返される他の値と比較して、それらがメインスレッドか別のスレッドかを識別できます。

私はよく構造化されたコードを持つことが賢明だと思いますが。 スレーブスレッドで実行される関数のようなものと、マスタスレッドで実行されるものがあります。これは、この種の問題に対するより良いアプローチです。 Linuxの場合

+0

私は元の投稿に入れたのと同じように、私は**自動**並列化を行っています。これは元のプログラムがどのように見えるかを仮定することができないので、実行時にどのスレッドを特定するかを調べる必要があります。pthread_create )がオンになることがあります。 – user2958862

+0

その理由は私は現在のスレッドをチェックし、きちんと整理されたプログラムを書いているより簡単なルートには行かないといけないのです – user2958862

+0

それは合理的なようですが、 'thread_self()'はあなたのニーズに合っていますか? –

関連する問題