2012-05-01 16 views
10

all,W jaki sposób pthread jest implementowany w jądrze Linux 3.2?

Poniższy kod pochodzi z "Zaawansowanego programowania w środowisku Unix", tworzy nowy wątek i wypisuje identyfikator procesu oraz identyfikator wątku dla głównych i nowych wątków.

W książce napisano, że w systemie Linux wynik tego kodu wskazuje, że dwa wątki mają różne identyfikatory procesowe, ponieważ pthread używa procesu lekkiego do emulowania wątku. Ale kiedy uruchomiłem ten kod w Ubuntu 12.04, ma jądro 3.2, wydrukowano ten sam pid.

tak, czy nowe jądro Linuxa zmienia wewnętrzną implementację 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

Zobacz także: http://stackoverflow.com/questions/5514464/difference-between-pthread-and-fork-on-gnu-linux –

+3

Wikipedia ma przyzwoity artykuł na temat zmiany Linuksa na NPTL w jądrze 2.6: http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library i krótszy artykuł wyjaśniający niektóre z niedociągnięć starszego modelu wątków, LinuxThreads: http://en.wikipedia.org/wiki/LinuxThreads –

Odpowiedz

19

Na Linuksie pthread używa clone syscall ze specjalną flagą CLONE_THREAD.

Patrz: documentation z clone syscall.

CLONE_THREAD (od Linux 2.4.0-test8)

Jeśli CLONE_THREAD jest dziecko znajduje się w tej samej grupie wątków procesie wywoływania. Aby pozostała część dyskusji na temat CLONE_THREAD była bardziej czytelna, termin "wątek" jest używany w odniesieniu do procesów w grupie wątków.

Grupy wątków to funkcja dodana w systemie Linux 2.4 w celu obsługi wątków POSIX z zestawu wątków, które udostępniają pojedynczy PID. Wewnętrznie, ten wspólny PID jest tak zwanym identyfikatorem grupy wątków (TGID) dla grupy wątków. Od Linuksa 2.4 wywołania getpid (2) zwracają TGID wywołującego.

I tak naprawdę, Linux robi change its thread implementation, ponieważ wątki POSIX.1 requires mają ten sam identyfikator procesu.

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

Dziękuję bardzo! Dałeś mi właściwą rzecz! – jiluo

4

Linux zazwyczaj wykorzystuje dwie implementacje pthreads: LinuxThreads i Native POSIX Thread Library(NPTL), chociaż były to w dużej mierze nieaktualne. Kernel z wersji 2.6 zapewnia NPTL, który zapewnia znacznie bliższą zgodność z SUSv3 i działa lepiej, zwłaszcza gdy istnieje wiele wątków.
Można zapytać konkretną realizację pthreads pod skorupą poleceniem:

getconf GNU_LIBPTHREAD_VERSION

Można również uzyskać dokładniejszy sposób różnicę realizacji w The Linux Programming Interface.

Powiązane problemy