Advanced Linux Programmingの概念に出くわしました。ここにリンクがあります: 4.5 GNU/Linux スレッドの実装を参照してください。
作者が言っていることの概念ははっきりしていますが、スレッドのプロセスIDを印刷するために彼が説明したプログラムと混同しています。
ここにコードがあります
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void* thread_function (void* arg)
{
fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
/* Spin forever. */
while (1);
return NULL;
}
int main ()
{
pthread_t thread;
fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
pthread_create (&thread, NULL, &thread_function, NULL);
/* Spin forever. */
while (1);
return 0;
}
著者によると、上記のコードの出力は次のとおりです。
% cc thread-pid.c -o thread-pid -lpthread
% ./thread-pid &
[1] 14608
main thread pid is 14608
child thread pid is 14610
コンパイル時に得られる出力は
[1] 3106
main thread pid is 3106
child thread pid is 3106
スレッドを作成するために、Linux はプロセスを作成するためにforkシステム コールが行うのと同じように、clone (ほとんどの場合) を内部的に呼び出すことを理解しています。唯一の違いは、プロセス内で作成されたスレッドは同じプロセス アドレス空間を共有するのに対し、親プロセスによって作成されたプロセスは親プロセスのアドレス空間をコピーすることです。したがって、スレッドでプロセス ID を出力すると、同じプロセス ID になると思います。しかし、本では同じ結果ではありません。
彼が何について話しているのか教えてください..? 本/私の答えは間違っていますか..?