2012-05-01 81 views
10

全部,在Linux內核3.2中如何實現pthread?

下面的代碼來自「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; 
} 
+0

另請參閱:http://stackoverflow.com/questions/5514464/difference-between-pthread-and-fork-on-gnu-linux –

+3

維基百科上有一篇關於Linux在內核2.6中對NPTL進行切換的體面文章: http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library以及一篇較短的文章,它解釋了舊版線程模型LinuxThreads的一些缺點:http://en.wikipedia.org/wiki/LinuxThreads –

回答

19

在Linux pthread使用clone系統調用與一個特殊的標誌CLONE_THREAD

請參閱clonedocumentation系統調用。

CLONE_THREAD(因爲Linux 2.4.0-test8)

如果CLONE_THREAD被設置時,子被放置在相同的線程組作爲調用進程英寸爲了使CLONE_THREAD的其餘討論更具可讀性,術語「線程」用於引用線程組中的進程。

線程組是Linux 2.4中添加的一項功能,用於支持一組線程的POSIX線程概念,共享一個PID。在內部,該共享PID是線程組的所謂線程組標識符(TGID)。從Linux 2.4開始,對getpid(2)的調用返回調用者的TGID。

事實上,Linux做change its thread implementation,因爲POSIX.1 requires線程共享相同的進程ID。

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通常使用並行線程的兩種實現方式:LinuxThreadsNative POSIX Thread Library(NPTL),雖然前者在很大程度上是過時的。 2.6中的內核提供了NPTL,它提供了更接近SUSv3的性能,並且性能更好,特別是當線程數很多時。
可以使用命令查詢具體實施下殼並行線程的:

getconf GNU_LIBPTHREAD_VERSION

您還可以在The Linux Programming Interface獲得更詳細的實施差別。