web-dev-qa-db-ja.com

pthread_self()とgettid()の違いは何ですか?どちらを使うべきですか?

LinuxでスレッドのCPUアフィニティを設定しようとしています。次のアプローチのどれが推奨されるか知りたいです:

  1. Pthread_self()を使用してスレッドIDを取得します

    引数としてスレッドIDを渡すことにより、pthread_setaffinity_np(....)を使用してCPUアフィニティを設定します

  2. Gettid()呼び出しを使用してスレッドIDを取得します

    プロセスIDの代わりにスレッドIDを渡すことにより、sched_setaffinity(....)を使用してCPUアフィニティを設定します

追伸:CPUアフィニティを設定した後、スレッドのスケジューリング優先度を上げるつもりです。

24
roelf

それらは同じではありません。これが私が[〜#〜] tlpi [〜#〜]から収集したいくつかのビットです(私は見つけることができませんでしたこれを完全に説明する十分な大きさのブロック)。お急ぎの場合は、おそらく最後の部分だけが必要です。

gettid

Linux 2.4では、スレッドが独自のスレッドIDを取得できるようにするために、新しいシステムコールgettid()が導入されました。

スレッドグループ内の各スレッドは、一意のスレッド識別子によって区別されます。スレッドIDは、プロセスIDに使用されるのと同じデータ型_pid_t_を使用して表されます。スレッドIDはシステム全体で一意であり、カーネルは、スレッドがプロセスのスレッドグループリーダーである場合を除いて、システム上の他のプロセスIDと同じスレッドIDがないことを保証します。

_pthread_self_

プロセス内の各スレッドは、スレッドIDによって一意に識別されます。スレッドは、pthread_self()を使用して独自のIDを取得できます。

_pthread_t_データ型は不透明(OPAQUE)データとして扱われる必要があるため、スレッドIDを比較するにはpthread_equal()関数が必要です。

Linuxスレッドの実装では、スレッドIDはプロセス間で一意です。ただし、これは必ずしも他の実装に当てはまるわけではなく、SUSv3は、アプリケーションが別のプロセスのスレッドを識別するためにスレッドIDを移植可能に使用できないことを明示的に示しています

gettid vs _pthread_self_

POSIXスレッドIDは、Linux固有のgettid()システムコールによって返されるスレッドIDと同じではありません。 POSIXスレッドIDは、スレッドの実装によって割り当てられ、維持されます。 gettid()によって返されるスレッドIDは、カーネルによって割り当てられる番号(プロセスIDと同様)です。

私は_pthread_setaffinity_np_を使用しますが、マニュアルには次のように記載されていることに注意してください。

これらの関数は、sched_setaffinity(2)の上に実装されています。

20
cnicutar

gettid()はシステムコールとしてのみ存在し、API呼び出しとして直接公開されていないという事実は、「自分が行っていることを完全に確信している場合にのみ使用する」ことを意味し、gettid()は移植可能であることを意図していないと思います。 。

pthreadに固執すれば、より良くなるはずです。後でpthread_setschedparam()を使用してスケジューリングポリシー/優先度を変更できます

0
user666412