2012-05-01 9 views
10

すべて、pthreadはLinuxカーネル3.2でどのように実装されていますか?

以下のコードは、「Unix環境での高度なプログラミング」から来ており、新しいスレッドを作成し、メインスレッドと新しいスレッドのプロセスIDとスレッドIDを出力します。

本書では、pthreadが軽量プロセスを使用してスレッドをエミュレートするため、このコードの出力では2つのスレッドに異なる プロセスIDがあることが示されています。しかし、私がUbuntu 12.04でこのコードを実行したとき、それはカーネル3.2を持ち、同じPIDを出力しました。

新しいlinuxカーネルはpthreadの内部実装を変更しますか? Linuxのpthread

#include "apue.h" 
#include <pthread.h> 

pthread_t ntid; 

void printids(const char *s) { 
    pid_t  pid; 
    pthread_t tid; 
    pid = getpid(); 
    tid = pthread_self(); 
    printf("%s pid %u tid %u (0x%x)\n", 
     s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid); 
} 

void *thread_fn(void* arg) { 
    printids("new thread: "); 
    return (void *)0; 
} 

int main(void) { 
    int err; 
    err = pthread_create(&ntid, NULL, thread_fn, NULL); 
    if (err != 0) 
    err_quit("can't create thread: %s\n", strerror(err)); 
    printids("main thread: "); 
    sleep(1); 
    return 0; 
} 
+0

また、参照してください:http://stackoverflow.com/questions/5514464/difference-between-pthread-and-fork-on-gnu-linux –

+3

ウィキペディアにはスイッチに関する適切な記事があります。カーネル2.6でNPTLにLinuxを作った: http://en.wikipedia.org/wiki/Native_POSIX_Thread_Libraryと、より古いスレッドモデル、LinuxThreadsの欠点のいくつかを解説した短い記事:http://en.wikipedia.org/wiki/LinuxThreads –

答えて

19

は特別なフラグCLONE_THREADcloneシステムコールを使用しています。

documentationclone syscallを参照してください。

CLONE_THREAD(以降のLinux 2.4.0-TEST8)

CLONE_THREADが設定されている場合、子供は、呼び出しプロセスと同じスレッド・グループに置かれます。 CLONE_THREADの議論の残りの部分をより読みやすくするために、「スレッド」という用語は、スレッドグループ内のプロセスを参照するために使用されます。

スレッドグループは、Linux 2.4で追加された機能で、スレッドセットのPOSIXスレッドの概念をサポートしました。は単一のPIDを共有します。内部的には、この共有PIDは、スレッドグループのためのいわゆるスレッドグループ識別子(TGID)である。 Linux 2.4以降、getpid(2)の呼び出しは呼び出し側のTGIDを返します。

スレッドは同じプロセスIDを共有しているため、実際にはLinuxはchange its thread implementationです。前者は主に廃止されたが、LinuxThreadsNative POSIX Thread Library(NPTL)

In the obsolete LinuxThreads implementation, each of the threads in a process 
    has a different process ID. This is in violation of the POSIX threads 
    specification, and is the source of many other nonconformances to the 
    standard; see pthreads(7). 
+0

ありがとうございました!あなたは私に正しいことを教えてくれた! – jiluo

4

Linuxは、典型的には、pスレッドの2つの実装を使用します。 2.6からのカーネルは、SUSv3とのより近い適合性を提供するNPTLを提供し、特にスレッドが多い場合に特に優れています。
あなたはコマンドを使用して、シェルの下でのpthreadsの特定の実装を照会することができます

getconf GNU_LIBPTHREAD_VERSION

ます。またThe Linux Programming Interfaceで、より詳細な実装差を得ることができます。

関連する問題