44

pthread_tがあり、CPUアフィニティを変更したいと思います。問題は、 pthread_setaffinity_np()がないglibc2.3.2を使用していることです。ただし、pthread_setaffinity_np()自体がsched_setaffinity()のラッパーであるため、これは問題ありません。これは、プロセスIDの代わりにスレッドIDを渡して、任意のスレッドのアフィニティを設定することで呼び出すことができます。

しかし... sched_setaffinityが使用できるスレッドIDはOSスレッドIDであり、 gettid()システムコールから取得できる種類です。これは不透明(OPAQUE)型のpthread_tとは異なり、gettid()は現在のスレッドのthread-idのみを返します。任意のスレッドのCPUアフィニティを設定できる必要があります。

残念ながら、pthreadのプライベート部分にアクセスできません。そのため、pthread_tをにキャストしてスレッドIDを盗むことができますstruct pthread *プライベートな実装に依存することはさらに多くの問題を求めているので、さらに良いと思います。

私もpthread_getunique_np関数を読んでいますが、これは「一意の整数識別子」を返します。これは、OSスレッドIDと同等の形や形式ではないと思います。

したがって、質問:任意のpthread_tからスレッドIDを取得するにはどうすればよいですか?

4

5 に答える 5

37

s は Linux スレッドで実装する必要はなく (さらに言えば、pthreadカーネル スレッドもまったく必要ありません)、一部の実装は完全にユーザーレベルまたは混合であるため、pthreads インターフェイスはこれらの実装の詳細にアクセスする関数を提供しません。移植可能ではありません ( pthreadLinux の実装間であっても)。それらを使用するスレッド ライブラリはこれを拡張機能として提供できますが、それを行うものはないようです。

スレッド ライブラリの内部データ構造にアクセスする以外に (プロセッサ アフィニティと Linux スレッド ID に関する仮定では、とにかくコードは移植可能ではありませんが)、作成時にトリックを実行できる場合があります。 、スレッドを作成するコードを制御する場合:

を呼び出すpthread_create()エントリ関数を指定しますgettid()(ちなみに、syscallマクロは常に によってエクスポートされるとは限らないため、マクロを直接使用する必要がある可能性が高いですlibc)。結果をどこかに保存してから、元のエントリ関数を呼び出します。同じエントリ関数を持つ複数のスレッドがある場合は、インクリメントされたポインタを のarg引数の配列に渡すことができますpthread_create。これは、スレッド ID を格納するために作成したエントリ関数に渡されます。 のpthread_t戻り値pthread_createを同じ順序で、作成したすべてのスレッドの Linux スレッド ID をその値を指定して調べることができpthread_tます。

このトリックが価値があるかどうかは、スレッドライブラリの内部構造にアクセスしないか、pthread_setaffinity_np.

于 2009-02-17T21:29:49.683 に答える
2
pthread_t pthread_self()

これは、スレッド ID である現在の pthread_t を返します。これを「unsigned int」型に変換できます。

于 2013-09-06T10:40:08.807 に答える
1

スレッドからスレッドIDを書き込んで後でアクセスできる共有int配列を使用した簡単な回避策をお勧めします。

それが役立つことを願っています。

于 2009-02-17T21:23:13.083 に答える