GNU/Linux >> Linux の 問題 >  >> Linux

pthread_self() によって返されるスレッド ID は、gettid(2) の呼び出しによって返されるカーネル スレッド ID と同じではありません。

<ブロック引用>

では、pthread_self orgettid を使用してどのスレッドが関数を実行しているかを判断する必要があるかどうかは、どのような基準に基づいて決定すればよいでしょうか?

常に pthread_self() を使用する必要があります アプリケーション内のスレッドを識別したいときはいつでも。 gettid() できる 特定の目的に使用および Linuxだとわかっている場合。例:gettid() スレッド固有のシードのシードを取得するために使用できます (srand() で使用) ).

<ブロック引用>

どちらも移植性がありません。

これは完全に真実ではありません。 gettid() Linux 固有の機能であるため、移植性がありません。しかし pthread_self() その表現について何の仮定もしない限り、移植可能です。

たとえば、次はではない ポータブル。

printf("Thread ID is: %ld", (long) pthread_self());

pthread_self() が何であれ、 ある種の整数になります。しかし

pthread_t my_tid; //filled elsewhere

pthread_t tid = pthread_self();

if( pthread_equal(my_tid, tid) ) {
   /* do stuff */
}

完全に移植可能です。

前者は前提であるため、移植性がありません。 そのスレッド ID は整数ですが、後者はそうではありません。

<ブロック引用>

スレッド ID を取得する関数が 2 つあるのはなぜですか?

これらは、同じ値を取得するための 2 つの異なる方法ではありません。 1 つ (pthread_self() はスレッド ライブラリ (pthreads) によって提供され、もう一方 (gettid() OS固有の機能です。 OS が異なれば、gettid() のようなスレッド ID を取得するための別のインターフェイス/syscall が提供される場合があります。 . gettid() に頼ることはできません。 ポータブル アプリケーションで。


pthread_self() returns the process-wide unique pthread-id.

gettid() は、(pthread 実装固有の) システム全体で一意のスレッド ID (Linux の場合) を返します。

the TID(thread id) returned by gettid() is unique inside a process

はい。

(or inside a program with multiple processes,

はい。

inside a process, different thread has different thread id.

はい。

the TID returned by pthread_self() is unique across processes,

いいえ

different thread has different TID on the same machine at the same time.

はい、同じプロセスで、マシン全体でいいえ。

gettid() は Linux 固有であり、したがって移植性がないため、システム全体で pthread を識別する唯一の方法は、getpid() によって返される (システム全体で一意の) 親プロセス ID を、その (プロセス全体で一意の) pthread と共に使用することです。 pthread_self() によって返される ID。


これは、概念の違いに関する興味深い研究です。 用語と実際のソフトウェア エンティティ (特定のソフトウェア抽象化に属します)。

まず、種類に注意してください

pid_t gettid(void);
pthread_t pthread_self(void);

1 つは pid_t です もう一つは pthread_t です .これらはどちらも、thread と呼ばれる共通の概念エンティティを参照しています。 、しかし、異なるタイプは、これらが2つの異なるsoftware entitiesであることを意味します .これらは thread id の異なる表現です 、そしてそれを組み込んだソフトウェア抽象化内で意味をなします。つまり、pthread_t 理にかなっているのみ pthread によってサポートされる抽象化内 パッケージ、および pid_t このタイプを組み込む抽象化内で意味があります (つまり、pid_t を扱う Linux システム コール ).

コンテキストに基づいて正しいタイプを使用する必要があります。 pthread_t を使用 タイプ pthread_t を必要とするコンテキストで と pid_t pid_t が必要なコンテキストで - 同じスレッドを参照している可能性があるにもかかわらず。

これらのコンテキストのそれぞれには、比較と等価のための構文が規定されています。 pid_t == で直接比較できます 演算子、 pthread_t の間 pthread_equal を呼び出して比較する必要があります .

この二重表現/ソフトウェア抽象化の理由は、 pthread ライブラリは、さまざまなオペレーティング システムに実装できる移植可能なスレッド ライブラリです。 pthread のさまざまな実装 ライブラリは thread id を保証します タイプは常に pthread_t です .これらのスレッドは、オペレーティング システム固有の thread entity にマップされる可能性があります その OS 識別子はオペレーティング システムによって異なります (たとえば、Linux の場合は pid_t です)。; Windows の場合は DWORD です ).

そのため、基盤となる実装は OS ごとに異なる場合がありますが、pthread に対して記述されたコードは 抽象化は、OS 間で移植可能です (pthread に限定する限り) 抽象化)


Linux
  1. `md5sum`がインターネットと同じハッシュを与えないのはなぜですか?

  2. 線はほとんど同じですが、順序が狂っていますか?

  3. カーネルがプロセスと同じアドレス空間にマップされるのはなぜですか?

  1. 同じ引数で別のコマンドを実行するにはどうすればよいですか?

  2. OS に応じて同じマシンに異なる静的 IP アドレスを割り当てる方法は?

  3. カーネルのビルド後に vmlinuz と initrd が見つかりませんか?

  1. Linuxカーネルテストのライフサイクル

  2. 同じコンピュータ上の 2 つの異なる OS 間でファイルを共有することはできますか?

  3. EPEL から同じマシンに 2 つの異なるバージョンの Java をインストールするにはどうすればよいですか?