5

forkpthread_createプロセス ID またはスレッド ID を返します。

しかし、これらの ID の値の範囲がわかりません。

ここで、ルックアップ テーブルを作成したいと思います。各エントリには、スレッド ID の項目/フィールドがあります。各エントリの構造は次のようになります。

 typedef struct {
   int seq;
   pthread_t tid;
   ...
 } entry_t;

tidスレッドの tid を取得できないときに、エントリに無効な値を割り当てたい(すぐにこのフィールドに有効なフィールドが入力されますが、その前に、fill関数は pid が有効かどうかをチェックします) . では、スレッドとプロセス ID の値の範囲は?

4

4 に答える 4

8

タイプはpthread_t完全に不透明です。関数と等しいかどうかのみを比較できpthread_equal、有効なスレッド ID とは異なる予約値はありませんが、そのような値はおそらく POSIX 標準の次のバージョンに追加される予定です。そのため、スレッド ID と一緒に 2 番目のフィールドを保存して、それが有効かどうかを追跡する必要があります。

于 2013-05-17T00:20:20.170 に答える
3

pid の最大値は変更可能で、デフォルトでは short int の最大値のサイズである 32768 です。また、初期バージョンの UNIX と互換性があります。

/proc/sys/kernel/pid_max で確認および変更できます。

ところで、</p>

プロセス ID 0 は通常、スケジューラ プロセスであり、多くの場合、スワッパーとして知られています。カーネルの一部であり、システム プロセスと呼ばれるこのプロセスに対応するディスク上のプログラムはありません。プロセス ID 1 は通常、init プロセスであり、ブートストラップ手順の最後にカーネルによって呼び出されます。このプロセスのプログラム ファイルは、古いバージョンの UNIX システムでは /etc/init であり、新しいバージョンでは /sbin/init です。このプロセスは、カーネルがブートストラップされた後に UNIX システムを起動する役割を果たします。--APUE

tid は、それが属するプロセスのコンテキスト内でのみ意味を持ちます。UNIX の異なるファミリでは、pthread_t は同じタイプではありません。

Linux 2.4.22 は、pthread_t データ型に unsigned long integer を使用します。Solaris 9 は、pthread_t データ型を符号なし整数として表します。FreeBSD 5.2.1 および Mac OS X 10.3 は、pthread_t データ型の pthread 構造体へのポインターを使用します。--APUE

そのため、単純にそのスコープを伝えることはできません。

しかし、threads_max はプロセス内の最大スレッド数を示し、/proc/sys/kernel/threads-max で確認および変更できます。

于 2013-05-17T01:12:07.140 に答える
2

他の人が指摘したように、無効な pthread-id を示す値が定義されていません。

これを回避する 1 つの方法は、次のようにスレッドを記述する構造を変更することです。

typedef struct {
  int seq;
  pthread_t pthread;
  int pthread_is_valid; /* set this to 0 on initialisation of the structure 
                          and change it be 1 if pthread_create() was successfull. */
  ...
} entry_t;

また、pthread_create()の最初のパラメーターによって設定された値を呼び出さないことをお勧めします。tidgettid()


無効なプロセス ID-1のように。

于 2013-05-17T11:16:11.267 に答える
0

私の意見では、定義されたエラー値を tid 自体に割り当てて、無効なスレッド ID を追跡できないのはなぜですか。ルックアップテーブルを作成しているため、テーブルが大きくなったときに構造体にメンバーを追加し続けると、サイズが制限される場合があります。

/* スレッド識別子 */ typedef unsigned long int pthread_t;

pthread_create の結果を確認するときに、おそらく独自に定義したエラー値を割り当てます。

例: pthread_create の失敗 - say -ve 値を tid に割り当てます。そのため、ルックアップ中に、独自の #define -ve 値をチェックして検証できます。

于 2013-05-17T12:07:20.803 に答える