2012-02-14 4 views
1

На рисунке 11.2 APUE 2, есть код для записи демо использование резьб API, как показано ниже:Является ли APUE неправильным описанием потоков linux?

#include <pthread.h> 
#include <stdio.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 *thr_fn(void *arg) 
{ 
     printids("new thread: "); 

     return (void*)0; 
} 

int main(void) 
{ 
     int err; 

     err = pthread_create(&ntid, NULL, thr_fn, NULL); 
     if (err != 0) 
       return -1; 

     printids("main thread: "); 
     sleep(1); 
     return 0; 
} 

и книга говорит выход, как это,

$./a.out 
new thread: pid 6628 ... 
main thread: pid 6626 ... 

Pid отличается! Это связано с тем, что «Linux использует clone() для реализации потоков, так же как fork(), поэтому система рассматривает потоки как отдельные процессы, которые совместно используют ресурсы».

Но когда я проверил, я обнаружил, что результат отличается от результата APUE, который

$ ./a.out 
main thread: pid 13301 tid 3078153920 (0xb778e6c0) 
new thread: pid 13301 tid 3078151024 (0xb778db70) 

Идентификатор это то же самое! так APUE устарел? Но linux действительно использует клон для реализации потоков, а в ядре linux они рассматриваются как разные процессы. Почему идентификатор процесса одинаковый?

ответ

1

Существует высокая вероятность того, что ваша версия APUE может устаревать в том смысле, что она относится к LinuxThreads вместо NPTL.

Вот соответствующий раздел из клона (2) станица руководства, который проливает свет на этом вопросе:

"групп тема были функция добавлена ​​в Linux 2.4 для поддержки POSIX Threads понятия набора нитей, которые разделяют один ПИД-регулятора. Внутренне, этот общий PID является идентификатором так называемой нити группы (TGID) для группы потоков. так как Linux 2.4, вызовы GETPID (2) возвращают TGID вызывающего абонента.

нити в пределах группы можно различать их (общесистемные) уникальные идентификаторы потоков (TID). TID нового потока доступен как результат функции, возвращаемый в e caller of clone() и поток могут получить свой собственный TID, используя gettid (2). "

Смежные вопросы