28

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

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

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

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

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

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

4

2 に答える 2

23

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

gettid

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

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

pthread_self

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

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

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

gettidpthread_self

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

私は一緒に行きpthread_setaffinity_npますが、マニュアルには次のように書かれていることに注意してください:

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

于 2011-06-16T13:05:17.537 に答える
0

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

あなたがに固執するならば、あなたはより良いはずですpthread。後でスケジュールポリシー/優先度を変更できますpthread_setschedparam()

于 2012-12-28T13:11:17.943 に答える