下面的代碼來自「Unix環境下的高級編程」,它創建一個新線程,並打印主線程和新線程的進程ID和線程ID。
在這本書中,它表示在linux中,這段代碼的輸出將顯示兩個線程有不同的 進程ID,因爲pthread使用輕量級進程來模擬線程。但是當我在Ubuntu 12.04中運行這個代碼時,它具有內核3.2,並且打印了相同的pid。
那麼,新的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 –
維基百科上有一篇關於Linux在內核2.6中對NPTL進行切換的體面文章: http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library以及一篇較短的文章,它解釋了舊版線程模型LinuxThreads的一些缺點:http://en.wikipedia.org/wiki/LinuxThreads –