すべて、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;
}
また、参照してください:http://stackoverflow.com/questions/5514464/difference-between-pthread-and-fork-on-gnu-linux –
ウィキペディアにはスイッチに関する適切な記事があります。カーネル2.6でNPTLにLinuxを作った: http://en.wikipedia.org/wiki/Native_POSIX_Thread_Libraryと、より古いスレッドモデル、LinuxThreadsの欠点のいくつかを解説した短い記事:http://en.wikipedia.org/wiki/LinuxThreads –