9

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 になると思います。しかし、本では同じ結果ではありません。

彼が何について話しているのか教えてください..? 本/私の答えは間違っていますか..?

4

4 に答える 4

9

libc libuClibc-0.9.30.1.so (1)を含む Linux の本と同じ結果が得られます。

root@OpenWrt:~# ./test
main thread pid is 1151
child thread pid is 1153

ubuntuのlibcを含むLinuxでこのプログラムを実行しようとしましたlibc6 (2)

$ ./test
main thread pid is 2609
child thread pid is 2609

libc (1)linuxthreadsは pthread の実装を使用します

そして libc (2) use NPTL("Native posix thread library") pthread の実装

linuxthreads FAQによると(J.3 回答):

各スレッドは実際には個別の PID を持つ個別のプロセスであり、スレッドの PID に送信されたシグナルはそのスレッドによってのみ処理されます。

したがって、実装を使用する古いlibclinuxthreadsでは、各スレッドに個別のPIDがあります

実装を使用する新しいバージョンの libcNPTLでは、すべてのスレッドがメイン プロセスの同じ PID を持ちます。

NPTL、redhat チームによって開発されました。およびredhat NPTL ドキュメントNPTLによると: 実装で解決される問題の 1 つは次のとおりです。

(章: 既存の実装の問題、5 ページ)

異なるプロセス ID を持つ各スレッドは、他の POSIX スレッド実装との互換性の問題を引き起こします。信号はあまりうまく使用できないため、これは部分的に議論の余地がありますが、それでも目立ちます


そして、それはあなたの問題を説明しています。

NPTLpthread の (「ネイティブ posix スレッド ライブラリ」) 実装を含む新しい libc バージョンを使用している

linuxthreadsそして本はpthreadの実装を含む古いバージョンのlibcを使用しています

于 2013-10-30T08:28:46.997 に答える
7

あなたが作業しているテキストは非常に古いものです (2001)。古いバージョンの Linux では、共有アドレス空間を持つ個別のプロセスとしてスレッドが実装されていました。各スレッドには個別の pid がありました。ただし、このスレッド モデルは POSIX に準拠しておらず、多くの移植性の問題がありました。

2.6 あたりから、Linux は「ネイティブ POSIX スレッド ライブラリ」(NPTL) に切り替わりました。この実装では、スレッドは独自の PID を取得しません。

于 2013-10-30T07:45:18.427 に答える